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

複数のテーブルをCount()するSQLクエリ

    サブクエリファクタリング(9i +):

    WITH count_cars AS (
        SELECT t.person_id
               COUNT(*) num_cars
          FROM CARS c
      GROUP BY t.person_id),
         count_children AS (
        SELECT t.person_id
               COUNT(*) num_children
          FROM CHILDREN c
      GROUP BY t.person_id),
         count_pets AS (
        SELECT p.person_id
               COUNT(*) num_pets
          FROM PETS p
      GROUP BY p.person_id)
       SELECT t.name,
              NVL(cars.num_cars, 0) 'Count(cars)',
              NVL(children.num_children, 0) 'Count(children)',
              NVL(pets.num_pets, 0) 'Count(pets)'
         FROM PERSONS t
    LEFT JOIN count_cars cars ON cars.person_id = t.person_id
    LEFT JOIN count_children children ON children.person_id = t.person_id
    LEFT JOIN count_pets pets ON pets.person_id = t.person_id
    

    インラインビューの使用:

       SELECT t.name,
              NVL(cars.num_cars, 0) 'Count(cars)',
              NVL(children.num_children, 0) 'Count(children)',
              NVL(pets.num_pets, 0) 'Count(pets)'
         FROM PERSONS t
    LEFT JOIN (SELECT t.person_id
                      COUNT(*) num_cars
                 FROM CARS c
             GROUP BY t.person_id) cars ON cars.person_id = t.person_id
    LEFT JOIN (SELECT t.person_id
                      COUNT(*) num_children
                 FROM CHILDREN c
             GROUP BY t.person_id) children ON children.person_id = t.person_id
    LEFT JOIN (SELECT p.person_id
                      COUNT(*) num_pets
                 FROM PETS p
             GROUP BY p.person_id) pets ON pets.person_id = t.person_id
    


    1. 一致する反転に基づいてレコードをグループ化する必要がある

    2. タイムゾーンが等しいPostgres時間

    3. 集計関数内の他の列(の最初の値)による個別の列値の順序付け

    4. EntityFrameworkを使用してストアドプロシージャからデータを取得する