[英]WHERE clause causing table to omit LEFT JOIN rule
我基本上試圖修改此存儲過程。
修改存儲過程:
CREATE PROCEDURE sp1(d1 date, d2 date, client INT(10))
declare d datetime;
create TEMPORARY TABLE foo (d date NOT NULL, Amount INT(10) DEFAULT 0);
set d = d1;
while d <= d2 do
insert into foo (d) values (d);
set d = date_add(d, interval 1 day);
end while;
SELECT SUM(p.Amount), foo.d
FROM foo LEFT JOIN ItemTracker_dbo.Payment ON foo.d = p.Datetime
WHERE p.ClientId = ClientId
GROUP BY
foo.d;
DROP TEMPORARY TABLE foo;
end PROCEDURE
注意: WHERE子句... p.ClientId = client
我正在試圖弄清楚為什么它會省略零點。
刪除WHERE p.ClientId = client
,程序開始返回NULL ...
為什么WHERE子句省略了空行? 我可能誤解了LEFT JOIN
究竟是什么。
如何過濾SUM(p.Amount)
結果只返回總和WHERE clientId = client
?
首先,不是您的示例代碼
SELECT SUM(p.Amount), foo.d
FROM foo LEFT JOIN ItemTracker_dbo.Payment ON foo.d = p.Datetime
WHERE p.ClientId = ClientId
GROUP BY
foo.d;
缺少表為ItemTracker_dbo.Payment
的別名的p
? 即,它不應該讀:
SELECT SUM(p.Amount), foo.d
FROM foo
LEFT JOIN ItemTracker_dbo.Payment p
ON foo.d = p.Datetime
WHERE p.ClientId = ClientId
GROUP BY foo.d;
無論如何,你遇到這個問題的原因是where子句條件直到處理外連接之后才會應用(其中外側的行被重新添加)所以你需要將where條件移動到連接條件中:
SELECT SUM(p.Amount), foo.d
FROM foo
LEFT JOIN ItemTracker_dbo.Payment p
ON foo.d = p.Datetime
And p.ClientId = ClientId
GROUP BY foo.d;
如果將所有條件置於LEFT JOIN
條件下,它應該有效:
SELECT SUM(p.Amount), foo.d
FROM foo
LEFT JOIN ItemTracker_dbo.Payment p ON foo.d = p.Datetime AND p.ClientId = ClientId
GROUP BY
foo.d;
將WHERE
子句移動到ON
子句中,如下所示:
SELECT SUM(p.Amount), foo.d
FROM foo LEFT JOIN ItemTracker_dbo.Payment ON foo.d = p.Datetime
and p.ClientId = ClientId
GROUP BY
foo.d;
通過在WHERE子句中放入ClientId比較,您實際上將LEFT JOIN
重新轉換為ClientId
上的INNER JOIN
。
問題是=運算符在SQL中不是NULL安全的。 NULL = NULL
為false。 你必須使用NULL安全的等價物,如果我在MySQL上正確記得<=>
。 您也可以使用COALESCE
函數或將a=b
寫為(a=b OR a IS NULL or b IS NULL)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.