2017-01-20 15 views
1

對不起錶轉換,如果這是一個重複的問題,但我不知道該使用哪個搜索關鍵詞(這就是爲什麼這個問題是模糊的爲好)如何使用SQL

我有一個這樣的表

Parent_ID  Parent_item Child_Item 
1    A    B 
1    A    C 
2    H    I 
2    H    J 
2    H    K 

我想有以下格式結果:

Parent_ID Parent_or_Child 
1   A 
1   B 
1   C 
2   H 
2   I 
2   J 
2   K 

如何才能做到這一點?

謝謝!

回答

1

您需要unpivot的數據,似乎所以你需要select distinct你不想重複。在Oracle 11.1或更高版本中,可以使用UNPIVOT運算符 - 優點是基表只會被讀取一次。

如果您需要,您可以添加order by子句;我沒有,所以輸出中的行是任意的順序(如果你比較你的「所需的輸出」)。

with 
    test_data (Parent_ID, Parent_item, Child_Item) as (
     select 1, 'A', 'B' from dual union all 
     select 1, 'A', 'C' from dual union all 
     select 2, 'H', 'I' from dual union all 
     select 2, 'H', 'J' from dual union all 
     select 2, 'H', 'K' from dual 
    ) 
-- End of test data (NOT part of the query). 
-- SQL query begins BELOW THIS LINE. 
select distinct parent_id, parent_or_child 
from test_data 
unpivot (parent_or_child 
       for col in (parent_item as 'parent_item', child_item as 'child_item')) 
; 

PARENT_ID PARENT_OR_CHILD 
---------- --------------- 
     2 I 
     1 A 
     1 B 
     1 C 
     2 H 
     2 J 
     2 K 

7 rows selected. 
+0

這工作正常,添加了一個命令完成它。謝謝! – SDR

+0

@SDR - 「UNPIVOT」的結果有第三列,簡單地命名爲「col」(在查詢中定義在'unpivot'子句中)。我不'選擇它,但它仍然可用,例如,爲了訂購。如果你需要先訂購父母,然後再訂購孩子,那麼可以有一個更復雜的'order by'子句來達到這個目的。例如:'按parent_id排序,col desc,parent_or_child'。 – mathguy

1

您需要unpivot的數據,使用UNION

select Parent_ID,Parent_item 
from yourtable 
Union 
select Parent_ID,Child_Item 
from yourtable 
+1

「您需要取消數據傳輸」是正確的,那麼爲什麼要使用'UNION'?使用'UNPIVOT'! 'UNION'解決方案將基表讀取兩次,這可能是一個重大的性能拖累。 – mathguy

+0

@mathguy - 我不確定Oracle中的Unpivot語法,所以沒有發佈一個答案。但是,這並不意味着這篇文章沒有用 –