我有一个表,它与其他表具有多个一对多的关系。假设主表是一个人,其他表则代表宠物,汽车和儿童。我想要一个查询,该查询返回人员的详细信息,他们拥有的宠物,汽车和儿童的数量,例如
Person.Name Count(cars) Count(children) Count(pets) John Smith 3 2 4 Bob Brown 1 3 0
做这个的最好方式是什么?
子查询分解(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