2015-09-08 67 views
-2

我想加入表A使用GROUP_ID = GROUP_ID在上TABLE_TYPE的類型的條件是不同的相同TABLEA
TABLEA
SQL JOIN沒有一些線

id name type_id group_id 
-------------------------------- 
    1 name1 4 2 
    2 name2 3 1 
    3 name3 3 2 
    4 name4 3 3 
    5 name5 4 3 

類型表:

id code 
------------ 
3 out 
4 in 


我想要得到的回報:

id name type_id group_id bro_id bro_name 
--------------------------------------------------------- 
    2 name2 3 1  1 name1 
    3 name3 3 2 
    4 name4 3 3  5 name5 

我試過SQL:

SELECT tA.id,tA.name,tt.code,tAi.id AS "bro_id",tAi.name AS "bro_name",tti.code 
FROM tablea tA 
INNER JOIN table_type tt ON (tA.type_id=tt.id and tt.code='OUT') 
LEFT JOIN tablea tAi ON (tA.group_id=tAi.group_id and tA.id!=tAi.id) 
INNER JOIN table_type tti ON (tti.id=tAi.type_id and tti.code='IN') 

,但我不能讓該行:

3 name3 3 2 null null 
+1

您想要的結果中的bro_id字段背後的邏輯是什麼? –

+0

bro_id是具有相同group_id的行的兄弟 – m3asmi

+0

@DanBracuk bro_id後面的邏輯知道類型= IN是否存在 – m3asmi

回答

2

您需要將您的左聯接的ON語句來查詢的底部:

SELECT tA.id,tA.name,spt.code,tAi.id AS "bro_id",tAi.name AS "bro_name",tti.code,tA.date 
FROM tableA tA 
INNER join table_type tt on (tA.type_id=tt.id and tt.code='out') 
LEFT join tableA tAi -- <---on statement removed 
INNER join table_type tti on (tti.id=tAi.type_id and tti.code='in') 
    on (sp.group_id=spi.group_id and sp.id!=spi.id) -- <--- moved to here 

你最後INNER JOIN基本上將查詢限制爲僅存在tAi的項目。這是因爲您直接將tti加入到tA和tt中,而您希望LEFT JOIN加入兩個表中的兩個子查詢。

你可以做其他建議的答案左加入最後兩個表,但它不是很理想,偶爾會出錯(我認爲在這種情況下它會很好)。

+1

這是有效的,我認爲比我的迴應更好。 [http://sqlfiddle.com/#!15/00f54/6](http://sqlfiddle.com/#!15/00f54/6)Upvoted! –

+0

關於這種移動ON語句的任何文檔? – m3asmi

+0

有趣的點@ m3asmi。我看了一下,並努力在其上找到任何東西。正如我所提到的,我認爲將左連接視爲連接子查詢,而不僅僅是加入表格。 – thab

1

已經使用了內部連接查找兄弟的類型。 還應左連接:

LEFT join table_type tti on (tti.id=tAi.type_id and tti.code='in') 

SQLDFIDDLE

+0

無法獲取該行:s – m3asmi

+0

這不可能。查詢'select * FROM tableA tA INNER join table_type tt on(tA.type_id = tt.id and tt.code ='out')'給你3行? –

+0

如果您只向上部查詢添加左連接,則不會丟失任何行:) –