2014-10-06 54 views
0

使用一個Oracle 11g DB,我正在尋找一種方法來將我的查詢結果中的兩行從一個表合併到一行中,但也允許NULL值數據尚未輸入。來自同一個表的Oracle多重連接查詢顯示重複值

基本上我有這樣的:

TABLE1包含對象識別

TABLE2包含對象數據的兩行(A型& B)

我想我需要運行外JOIN,它只在獲取對象數據類型A時工作,但當我添加第二個JOIN時,我爲B的每一行獲得多個A的重複行。

因此,如果有4個A值和5個B值,我會的拭目以待5行A對B的每一行(共20行)

SELECT T1.NAME, T2a.VALUE as TYPE_A, T2b.VALUE as TYPE_B 

FROM TABLE1 T1 

LEFT OUTER JOIN TABLE2 T2a ON (T1.ID = T2a.ID AND T2a.TYPE='A') 
LEFT OUTER JOIN TABLE2 T2b ON (T1.ID = T2b.ID AND T2b.TYPE='B') 

我想要得到這個(見A如何有6項,B有5個):

NAME TYPE_A  TYPE_B 

ID1  VALUE1  VALUE2 
ID1  VALUE1  VALUE2 
ID1  VALUE1  (NULL) 
ID1  VALUE1  VALUE2 
ID1  (NULL)  VALUE2 
ID1  VALUE1  (NULL) 
ID1  (NULL)  VALUE2 
ID1  VALUE1  (NULL) 

任何幫助將不勝感激。

KS

+0

你沒有在查詢任何其他加盟?你確定'ID'在它們各自的表中是唯一的嗎? – 2014-10-06 16:37:04

+1

對我來說,你只是想旋轉類型的數據...... – xQbert 2014-10-06 16:51:14

+0

ID1在這個例子中是相同的,TYPE_A和TYPE_B的數據是不同的。基本上我們有一種產品可以有兩種類型的測試。測試是在單獨的行(A和B)上,我需要將它們合併爲一行:product,testA,testB。如果有5個testA和6個testB,我似乎會得到30行(每個testB有一個testA行) – Casper 2014-10-07 15:33:20

回答

0

轉軸是否可以工作?

注意僅當您知道所需的所有Type值時才能使用透視。如果它不知道,那麼你必須使用動態SQL ..

SELECT * 
FROM 
(
    SELECT Name, Type, Value 
    FROM Table1 T1 
    INNER JOIN table2 T2 
    ON T1.ID = T2.ID 
) 
PIVOT 
(
    MAX(Value) 
    FOR (Type) IN ('A' AS TYPE_A, 
       'B' AS Type_B) 
); 
+0

可以將一個WHERE放在這裏用於WHERE name =' XYZ「? – Casper 2014-10-07 15:58:49

+0

我不明白爲什麼不。它可能發生在兩個不同的地方,取決於我們想要限制的地方。數據旋轉之前或之後。如果之前只需在on子句之後添加。如果在之後,在最後加上where子句)和之前;。 – xQbert 2014-10-07 16:46:02

0

PIVOT應該在這裏工作

SQL小提琴:http://www.sqlfiddle.com/#!4/46004f/2

SELECT * 
FROM (SELECT T1.ID, T2.type, T2.value 
FROM table1 T1 
JOIN table2 T2 
ON T1.ID = T2.ID) 
PIVOT 
(MAX(value) FOR type in ('A', 'B') 
) 
相關問題