首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左连接-保留空主记录

左连接-保留空主记录
EN

Stack Overflow用户
提问于 2021-06-25 12:40:25
回答 2查看 76关注 0票数 0

我有两个相关的表CarsAddItems,以及它们之间的关系1到0或许多,所以有或没有附加项目的汽车。

我需要查询,该查询将始终将汽车作为单个记录和其他汽车项目的附加记录,如:

代码语言:javascript
复制
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

如果我使用简单的左外连接,我无法获得这辆车的独奏记录,当汽车已经加入了额外的项目。

我可以得到这样的东西:

代码语言:javascript
复制
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

没有工会有更简单/更好的(联合)方式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-25 13:44:09

UNION ALL不做重复(这是必要的,因为cars查询和LEFT JOIN都会产生空载的cars)

UNION之所以代价高昂,只是因为它删除了重复项,通常导致排序。从一开始就不制造副本是更便宜的。

代码语言:javascript
复制
   -- 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
        ;
票数 1
EN

Stack Overflow用户

发布于 2021-06-25 13:44:51

你的版本没问题。或者,您可以使用横向

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68131152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档