2017-09-14 140 views
-2

我有一个表像下面: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来满足其他一些要求。这就是为什么我不想为此要求再次使用它。

+1

类是永远2元素?或者你可能有多个?目前为 – Squirrel

+0

...它将始终有2个元素。我只想拥有所需的输出。 – vivek

+1

mysql或mssql? – NEER

回答

0

您可以使用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那么t他唯一的选择是更改模式并为class创建另一个表。

+0

我已经提到,我不想在我的查询中再次使用Union/Union All运算符,因为我已经在使用此运算符来满足其他一些需求...谢谢! – vivek

+0

@vivek更新了答案.. –

+0

实际上,类列不在表模式..它在飞行..有条件的文本字符串。 – vivek

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 

OUTPUT:

Cid NAME class 
1 vv  A 
1 vv  N 
1 ff  B 
1 ff  P 
1 bb  C 
1 bb  U 
相关问题