2014-04-20 73 views
0

我的表是這樣的:加入本身的追求

ID DADOS TIPO 
1 UM 1 
2 DOIS 1 
3 TRES 1 
4 QUATRO 1 
5 CINCO 1 
1 SEIS 2 

我需要做出一個選擇返回此:

t1.id t1.dados t2.dados 
1  Um  Seis 
2  Dois  Null 
3  Tres  Null 
4  Quatro Null 
5  Cinco Null 

我以這種形式嘗試:

SELECT T1.ID, T1.DADOS, T2.DADOS 
FROM Tabela1 as T1 LEFT JOIN Tabela1 AS T2 ON T1.ID = T2.ID 
WHERE T1.TIPO = 1 AND T2.TIPO = 2 

但結果是這樣的:

ID T1.DADOS T2.DADOS 
1 UM SEIS 

我做錯了什麼?

回答

0

使用此代碼連接表本身:

SELECT T1.ID, T1.DADOS, T2.DADOS 
FROM Tabela1 as T1 LEFT JOIN Tabela1 AS T2 ON T1.ID = T2.ID 
              And T1.TIPO = 1 AND T2.TIPO = 2 

你也可以使用此代碼:

SELECT T1.ID, T1.DADOS, T2.DADOS 
FROM 
    (select * from Tabela1 T_1 
    where T_1.TIPO = 1) as T1 
    LEFT JOIN 
    (select * from Tabela1 T_2 
    Where T_2.TIPO = 2) AS T2 ON T1.ID = T2.ID 
+0

好,但是場「TIPO」不像ID來建立關係,「Tipo」是通知其他類型數據的字段。它就像我有兩個表:第一個表與Tipo = 1和第二個表與Tipo = 2 –

+0

好吧,我編輯答案,我認爲這個回答對你是正確的。 – Iraj

+0

您通過的第一個查詢不會帶來預期結果,但第二個查詢是完美的。謝謝!! –

0

這將做的工作

SELECT T1.ID, T1.DADOS as T1Dados, T2.DADOS as T2Dados 
FROM Tabela1 T1 
left JOIN Tabela1 T2 
ON T1.ID = T2.ID 
and T1.TIPO = 1 and T2.TIPO = 2 

看到一個演示這裏http://sqlfiddle.com/#!2/c7066/6

0

通過使用條款WHERE T1.TIPO = 1 AND T2.TIPO = 2,您需要在T2中找到匹配的記錄,因此實際上您正在將left join轉換爲inner join

爲了從T1那些在T2沒有匹配的記錄包括記錄,你可以在where條款更改爲

WHERE T1.TIPO = 1 AND (T2.TIPO IS NULL OR T2.TIPO = 2) 

WHERE T1.TIPO = 1 AND T2.TIPO <> 1