选择查询以使用一个不同的值复制相同的行

时间:2017-09-14 08:33:48

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

我有一张如下表:

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

我想对上面的结果运行一个select查询以获得所需的输出,如下所示:

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

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

3 个答案:

答案 0 :(得分:0)

您可以将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

<强>更新

如果您不想使用sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", KEYS[0]) sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", KEYS[1]) ,那么唯一的另一个选择是更改架构并为.option('forward_spark_s3_credentials', 'true') 创建另一个表。

答案 1 :(得分:0)

select  *
from    yourtable t
        cross apply dbo.[DelimitedSplit8K] (t.Class, '_') c

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

答案 2 :(得分:0)

如果你有固定的格式,这是一个简单的解决方案:

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