Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 左联_Mysql_Join_Union - Fatal编程技术网

Mysql 左联

Mysql 左联,mysql,join,union,Mysql,Join,Union,具有如下数据库结构: 汽车 汽车高度 id, car_id, color 1, 1, green 2, 1, blue 3, 2, red 4, 2, blue 我想得到这样的结果: id, name, color 1, mercedes, red 1, mercedes, green 1, mercedes, blue 2, volvo, blue 2, volvo, red 2, volvo, blue 3, bmw, green 目前我使用此查询: SELECT id, name, c

具有如下数据库结构:

汽车

汽车高度

id, car_id, color
1, 1, green
2, 1, blue
3, 2, red
4, 2, blue
我想得到这样的结果:

id, name, color
1, mercedes, red
1, mercedes, green
1, mercedes, blue
2, volvo, blue
2, volvo, red
2, volvo, blue
3, bmw, green
目前我使用此查询:

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
有没有办法不使用
联合
?我想知道是否可以使用
LEFT JOIN
添加一些空行,如:

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
时,我的查询如下所示:

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
移动到子查询,如

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

我认为没有
联合
/
联合所有人
就没有一个合理的方法可以做到这一点

这是一种不合理的方法,使用
交叉连接和过滤:

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);

这基本上重组了逻辑,因此
在功能上与
union all
在您的版本中的功能相同。

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

    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

请不要忘记在完成后放下表#Temp-最好清理一下。

否如果您想要第一个表和第二个表的值,您应该使用union。。同一行上的左连接返回值..不将行附加到其他结果澄清/专门化有帮助。通知回答者。请阅读并根据最小、完整和可验证的示例采取行动。违禁品很重要。你可能会限制你的想法,你在做什么,即你想要什么结果,因此什么查询可以通过“加入汽车”来表达你想要的结果。例如,在您的示例中,您不需要第一个/外部“car join”,因为必要的数据在子查询中,您可以使用子查询join t1。。。。但是的,也许汽车的指数意味着你写的是“更好”。细节在优化中很重要。PS你用谷歌搜索过“sql避免联合”等吗?我目前的一般评论是“更好”/“最好”等:在工程中没有“更好”/“最好”这样的东西,除非你定义它。同样不幸的是,所有合理的实用定义都需要大量的经验,其中包含大量的因素,这些因素与对细节的敏感度混乱相互作用。做简单的设计。当你通过测量证明一个设计和你能想到的所有备选方案都有问题(无论当时是什么意思),然后问一个非常具体的问题。这也应该定义“更好”/“最好”。谢谢。这方法太复杂了。我想简化我的查询,而不是相反。@dompil。您需要修复
car\u alt
,以便它在
car
中包含信息。
    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