簡體   English   中英

帶標志條件的左聯接查詢

[英]Left Join query with flag condition

嗨,我在顯示表cash所有行時遇到問題,如果該列沒有數據,則嘗試獲取cashassignment_id列,然后將結果打印為Unallocated 但是Cash 1丟失了。

我的SQL:

SELECT  
    cash.cash_id,
    cash.cash_name,
    IFNULL(cash_assignments.cashassignment_id, 'Unallocated') AS cashassignment_id
FROM cash
    LEFT JOIN cash_assignments USING(cash_id)
WHERE cash_assignments.cashassignment_valid = TRUE OR cash_assignments.cashassignment_valid IS NULL

演示鏈接http://sqlfiddle.com/#!9/ce446/1/0

嘗試將where條件移動到on子句:

SELECT c.cash_id, c.cash_name,
       COALESCE(ca.cashassignment_id, 'Unallocated') AS cashassignment_id
FROM cash c LEFT JOIN
     cash_assignments ca
     ON c.cash_id = ca.cash_id AND ca.cashassignment_valid = TRUE ;

我還修改了查詢以使用表別名(更易於編寫和讀取查詢),並使用COALESCE()代替ISNULL()COALESCE()是ANSI標准)。

聯接發生后,您的查詢正在過濾結果,因此您將過濾出想要保留的內容。 (如果我理解正確)

相反,您始終可以執行子查詢:

SELECT K.X, L.Y FROM
    (SELECT X FROM A) AS K
LEFT JOIN
    (SELECT Y FROM B) AS L
USING (SOME_ID)

在子查詢中,您可以添加where子句:

    (SELECT Y FROM B WHERE SOMECOND) AS L

這樣,您可以在加入表格之前過濾掉所需的行。

將其應用於您的問題是微不足道的,留給有興趣的讀者作為練習。 :)

通常,您不需要過濾子查詢中的行,優化器將執行此操作,這對於左側就足夠了(或者沒有占位符只是A):

    A AS K

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM