2017-03-14 56 views
-2

請查看下面的SQLFiddle鏈接中的SQL。SQL幫助,左加入過濾器

http://sqlfiddle.com/#!9/22e094/4

我的目標是從表1得到所有的記錄,如果SecId表2中存在,只能加入,如果狀態爲「Y」。

的結果應該是,它從表1拉:ID 1和2,而對於ID 1,它成功地離開了加入表2和拉「Y」

正如你可以在小提琴看到,我試過3種不同方式,但似乎無法得到它。

它讓我難住...幫助將是太棒了! :)

+0

如果是Oracle,爲什麼把它標記爲MySQL? – Niagaradad

+0

請以表格形式發佈預期結果,因爲您的描述不清楚 – BobC

+0

@Niagaradad我在SQLFiddle中遇到了Oracle選項問題 – Gvdk

回答

0

左連接,只有在ON子句中的連接條件,很好。

但是,你說你要保持行,其中status'Y'只有當存在於table2secid。所以這意味着你也想保留secidtable2NULL的行。

select *將不會飛行,因爲在兩個表中都有相同名稱的列secid。如果需要在where子句或查詢中的任何其他位置引用它們來區分它們(通過給它們別名 - 或至少其中之一;我給它們兩個別名)以打破歧義。而且,由於只能在SELECT子句中給出別名,該子句在WHERE子句之後進行求值,因此需要在子查詢中執行左連接。

select id, secid_a, secid_b, status 
from ( 
     select a.id, a.secid as secid_a, b.secid as secid_b, b.status 
     from table1 a left join table2 b 
         on a.secid = b.secid 
     ) 
where status = 'Y' or secid_b is null; 
+0

太棒了!而已!我沒有考慮使用select來過濾select的結果。 – Gvdk

+0

@Gvdk - 這被稱爲「帶有子查詢的查詢」或「嵌套查詢」,是SQL中非常常見的技術。你會一直使用它。 – mathguy

+0

謝謝,每天都要學點新東西! – Gvdk