簡體   English   中英

WHERE子句導致表省略LEFT JOIN規則

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

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