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

2つのSQLLEFTJOINSが誤った結果を生成する

    結合は左から右に処理されます(括弧で指定されている場合を除く)。 LEFT JOINの場合 (または単にJOIN 、同様の効果)1人のユーザーに3つの食料品を購入すると、3行( 1 x 3 )になります。 )。その後、同じユーザーの4つの魚市場に参加すると、12( 3 x 4 )になります。 )行、乗算 追加ではなく、結果の前のカウント あなたが望んでいたかもしれないように、それに。
    それによって、食料品や魚市場への訪問を同様に増やします。

    次のように機能させることができます:

    SELECT u.id
         , u.account_balance
         , g.grocery_visits
         , f.fishmarket_visits
    FROM   users u
    LEFT   JOIN (
       SELECT user_id, count(*) AS grocery_visits
       FROM   grocery
       GROUP  BY user_id
       ) g ON g.user_id = u.id
    LEFT   JOIN (
       SELECT user_id, count(*) AS fishmarket_visits
       FROM   fishmarket
       GROUP  BY user_id
       ) f ON f.user_id = u.id
    ORDER  BY u.id;
    

    1人または数人のユーザーの集計値を取得するには、相関サブクエリ 提供された@Vinceのように問題ありません。テーブル全体またはその主要部分については、nテーブルを集計し、結果に結合する方が(はるかに)効率的です 。このように、別のGROUP BYも必要ありません。 外側のクエリで。

    grocery_visits およびfishmarket_visits NULLです それぞれのテーブルに関連するエントリがないユーザーの場合。 0が必要な場合 代わりに(または任意の数)、 COALESCEを使用してください 外側のSELECT

    SELECT u.id
         , u.account_balance
         , COALESCE(g.grocery_visits   , 0) AS grocery_visits
         , COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
    FROM   ...
    


    1. PostgreSQLは部分インデックスを使用しません

    2. Entity Frameworkから単一のレコードを削除しますか?

    3. MariaDBがXpandでグローバルスケールを実現する方法

    4. FILESTREAMを使用したSQLデータベースへのファイルの保存–パート1