2017-09-14 53 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 
相關問題