首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL左连接和联合

问MySQL左连接和联合
EN

Stack Overflow用户
提问于 2018-04-18 03:21:42
回答 2查看 179关注 0票数 0

具有如下的数据库结构:

小汽车

代码语言:javascript
复制
id, name, color
1, mercedes, red
2, volvo, blue
3, bmw, green

car_alt

代码语言:javascript
复制
id, car_id, color
1, 1, green
2, 1, blue
3, 2, red
4, 2, blue

我想要得到这样的结果:

代码语言:javascript
复制
id, name, color
1, mercedes, red
1, mercedes, green
1, mercedes, blue
2, volvo, blue
2, volvo, red
2, volvo, blue
3, bmw, green

目前我使用这个查询:

代码语言:javascript
复制
SELECT id, name, color
FROM car
UNION
SELECT car.id, car.name, car_alt.color
FROM car
INNER JOIN car_alt ON car.id = car_alt.id_car

有没有办法不用UNION就能做到呢?我想知道是否可以只使用LEFT JOIN添加一些空行,如下所示:

代码语言:javascript
复制
SELECT car.id, car.name, COALESCE(car_alt.color, car.color)
FROM car
LEFT JOIN car_alt ON car.id = car_alt.id_car OR 'GET EMPTY ROW'

为了解释我为什么这样问,当我必须将更多的表连接到表car时,我的查询如下所示:

代码语言:javascript
复制
SELECT id, name, color,
t1.col, t2.col, t3.col, ...
FROM car
JOIN t1
JOIN t2
JOIN t3
...
UNION
SELECT car.id, car.name, car_alt.color,
t1.col, t2.col, t3.col, ...
FROM car
JOIN t1
JOIN t2
JOIN t3
...
INNER JOIN car_alt ON car.id = car_alt.id_car

所以这里有很多重复的地方。我想到的唯一另一种方法是将UNION移到子查询中,例如

代码语言:javascript
复制
SELECT car.id, car.name, union.color,
t1.col, t2.col, t3.col, ...
FROM car
JOIN t1
JOIN t2
JOIN t3
...
INNER JOIN (
SELECT car.id, car.color
FROM car
UNION
SELECT car_alt.car_id, car_alt.color
FROM car_alt) union ON car.id = union.id
EN

回答 2

Stack Overflow用户

发布于 2018-04-18 03:31:45

我不相信在没有union/union all的情况下有一种合理的方法来做这件事。

下面是一种不合理的方法,使用cross join和过滤:

代码语言:javascript
复制
select c.id, c.name, co.color
from (select distinct id, name from car) c cross join
     (select distinct color from car) co 
where exists (select 1 from car c2 where c2.id = c.id and c2.color = co.color) or
      exists (select 1 from car_alt ca where ca.id = c.id and ca.color = co.color);

这基本上重构了逻辑,因此or在功能上完成了union all在您的版本中所做的工作。

票数 0
EN

Stack Overflow用户

发布于 2018-04-18 05:52:44

如果您不想使用UNION,那么临时表如何?

代码语言:javascript
复制
    SELECT *
    into #Temp
    FROM car

    INSERT #Temp
    SELECT a.car_id, c.name, a.color
    FROM car_alt a INNER JOIN
         car c ON c.id = a.car_id

    SELECT *
    FROM #Temp
    ORDER BY id, name

请不要忘记在完成后删除TABLE #Temp --这是很好的清理方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49885959

复制
相关文章

相似问题

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