[英]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
嘗試將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.