我有两个相关的表Cars和AddItems,以及它们之间的关系1到0或许多,所以有或没有附加项目的汽车。
我需要查询,该查询将始终将汽车作为单个记录和其他汽车项目的附加记录,如:
CarName | ItemName
========+=========
Car1 | <- car without additional items
Car2 | <- car with additional items but this solo record needed as well
Car2 | Item1
Car2 | Item2
Car3 |
Car3 | Item3如果我使用简单的左外连接,我无法获得这辆车的独奏记录,当汽车已经加入了额外的项目。
我可以得到这样的东西:
SELECT carname,NULL AS itemname FROM cars
UNION
SELECT c.carname,ai.itemname
FROM cars c
LEFT JOIN additems ai ON ai.id_car=c.id没有工会有更简单/更好的(联合)方式吗?
发布于 2021-06-25 13:44:09
UNION ALL不做重复(这是必要的,因为cars查询和LEFT JOIN都会产生空载的cars)
UNION之所以代价高昂,只是因为它删除了重复项,通常导致排序。从一开始就不制造副本是更便宜的。
-- all the casrs
SELECT carname,NULL AS itemname
FROM cars
UNION ALL
-- additional detail records, if any
SELECT c.carname,ai.itemname
FROM cars c
JOIN additems ai ON ai.id_car=c.id
ORDER BY 1,2 NULLS FIRST
;发布于 2021-06-25 13:44:51
你的版本没问题。或者,您可以使用横向
SELECT t.*
FROM cars c
CROSS JOIN LATERAL (
SELECT c.carname, null FROM DUAL
UNION ALL
SELECT c.carname, i.itemname
FROM additems i
WHERE i.carname = c.carname
) t
ORDER BY 1, 2 NULLS FIRST;https://stackoverflow.com/questions/68131152
复制相似问题