【问题标题】:select query to duplicate same row with one different value选择查询以使用一个不同的值复制同一行
【发布时间】:2018-02-23 03:35:35
【问题描述】:

我有一个如下表:

CId  Name Class
1    vv   A_N
1    ff   B_P
1    bb   C_U

我想对上述结果运行选择查询以获得所需的输出,如下所示:

CId   Name   Class
1      vv     A
1      vv     N
1      ff     B
1      bb     P
1      ff     C
1      bb     U

另外,我在上面举了一个例子。在实际场景中,我有很多列并且查询非常大,以至于我已经在使用 Union all 来满足其他一些要求。这就是为什么我不想再次使用它来满足这个要求。

【问题讨论】:

  • 类总是2个元素吗?或者你可能有多个?
  • 现在......它总是有 2 个元素。我只想得到想要的输出。
  • mysql 还是 mssql?

标签: mysql sql sql-server sql-server-2008 select


【解决方案1】:

您可以将SUBSTRING_INDEXUNION 一起使用,例如:

SELECT CId, Name, SUBSTRING_INDEX(Class, '_', 1)
FROM table

UNION

SELECT CId, Name, SUBSTRING_INDEX(Class, '_', -1)
FROM table

完成后,您可以将其包装到另一个 SELECT 并应用 ORDER BY,例如:

SELECT a.* 
FROM (
    SELECT CId, Name, SUBSTRING_INDEX(Class, '_', 1)
    FROM table

    UNION

    SELECT CId, Name, SUBSTRING_INDEX(Class, '_', -1)
    FROM table
) a
ORDER BY a.Name;

更新

如果您不想使用UNION,那么唯一的其他选择是更改架构并为class 创建另一个表。

【讨论】:

  • 我已经提到我不想在我的查询中再次使用 Union/Union All 运算符,因为我已经在使用这个运算符来满足其他需要......无论如何谢谢!!!
  • 实际上类列不在表模式中..它在运行中..有条件的文本字符串。
  • 好吧,那么您不需要全部查询,它应该由您的应用程序/显示逻辑处理,而不是 SQL 查询。
【解决方案2】:
select  *
from    yourtable t
        cross apply dbo.[DelimitedSplit8K] (t.Class, '_') c

使用 DelimitedSplit8K 从 http://www.sqlservercentral.com/articles/Tally+Table/72993/

【讨论】:

    【解决方案3】:

    如果您有固定格式,那么这是简单的解决方案,例如:

    SELECT a.Cid,
        a.NAME,
        t.class
    FROM Product a
    CROSS APPLY(    
        SELECT LEFT(class, 1) class FROM @Product WHERE NAME = a.name
        UNION ALL
        SELECT RIGHT(class, 1) class FROM @Product WHERE NAME = a.name
    ) t
    

    输出:

    Cid NAME    class
    1   vv      A
    1   vv      N
    1   ff      B
    1   ff      P
    1   bb      C
    1   bb      U
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      相关资源
      最近更新 更多