sql >> データベース >  >> RDS >> PostgreSQL

Postgresの左外部結合がNullの値を返さない

    私は他の答えについて重大な疑問を持っているので、私は私の答えを与えています。フィルタの要件に注意する必要があります。 where句は結合後に実行されることを忘れないでください 。したがって、where句にフィルタ要件がある場合 非外部結合テーブルを参照している場合、(多くの状況で)外部結合を無効にしています。したがって、SQLを使用すると、適切な結合を使用するか、テーブル名を適切に移動してから、フィルター条件をwhere句からjoin句に移動するのが最も簡単な解決策のようです。

    SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
    FROM    download_time d 
    RIGHT OUTER JOIN fs_fault f ON 
        f.downloadtimeid = d.id
        AND f.faultcode IN (1000,1100)
        AND f.statusid IN(2, 4)
        AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
        AND d.bunoid = 166501
    GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
    

    同等であると私が信じるもう1つの方法は

    です。
    SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
    FROM    download_time d 
    RIGHT OUTER JOIN fs_fault f ON 
        f.downloadtimeid = d.id
        AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
        AND d.bunoid = 166501
    WHERE
        f.faultcode IN (1000,1100)
        AND f.statusid IN(2, 4)
    GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
    

    fs_faultのフィルター要件がどこにあるかは厳密には問題ではないためです。 (そしてあなたのSQLエンジンはとにかくそれをすべて変えるでしょう)

    編集:これがSQLFiddle です。 結合句とwhere句のフィルタリングを示します。



    1. これはエラーですORA-12154:TNS:指定された接続識別子を解決できませんでしたか?

    2. SQL Server 2008ManagementStudioがクエリの構文をチェックしていません

    3. SQL2は異なるフィルターでカウントします

    4. SQL Server アリサボート