繁体   English   中英

如果未找到匹配项,则左连接为空结果

[英]left join with empty results when no match is found

说我有这三个表:

Table: Baskets
id  |  name
1      Sale
2      Premium
3      Standard
4      Expired

Table: Fruit
id  |  name   | basketid
1      Apples    1
2      Oranges   2
3      Grapes    3
4      Apples    2
5      Apples    4

Table: Veggies
id  |  name   | basketid
1      Carrots     1
2      Peas        2
3      Asparagus   1

看起来第二个两个表应该只是一个名为produce的表,但在实际情况下,它们有充分的理由成为不同的表。 如果篮子在水果或蔬菜表中有行,我需要编写一个返回行的连接。 我以为我可以通过两个左连接完成此操作:

Select Baskets.*, fruit.name as fruit,
veggies.name as veggies 
from Baskets
left join Fruit on Baskets.id =  Fruit.basketid 
left join veggies on Baskets.id = Veggies.basketid 
where Baskets.id = 2;

但是这个语句返回我想要为空的字段中的值。 实际输出:

id  | name     |  fruit   |  veggies
2     Premium    Oranges     Peas
2     Premium    Apples      Peas

我想要的输出:

id  | name     |  fruit   |  veggies
2     Premium    Oranges     
2     Premium    Apples      
2     Premium               Peas

我怎么能做到这一点?

你需要将水果和蔬菜表联合成一个你加入的关系,一个la:

Select Baskets.*, produce.fruitname as fruit, produce.veggiename as veggies 
from Baskets
left join (SELECT basketid, name as fruitname, NULL as veggiename
           FROM fruit
           UNION
           SELECT basketid, NULL, name
           FROM veggies) produce
      ON baskets.id = produce.basketid
where Baskets.id = 2;

如果篮子中没有任何内容,则此查询将不返回任何行:

SELECT  baskets.*, fruit.name AS fruit, NULL AS veggie
FROM    baskets
JOIN    fruit
ON      fruit.basketId = baskets.id
WHERE   baskets.Id = 2
UNION
SELECT  baskets.*, NULL, veggie.name
FROM    baskets
JOIN    veggies
ON      veggies.basketId = baskets.id
WHERE   baskets.Id = 2

如果篮子中没有任何内容,此查询将返回带有两个NULLS的单行:

SELECT  baskets.*, fruit.name AS fruit, NULL AS veggie
FROM    baskets
LEFT JOIN
        fruit
ON      fruit.basketId = baskets.id
WHERE   baskets.Id = 2
UNION
SELECT  baskets.*, NULL, veggie.name
FROM    baskets
LEFT JOIN
        veggies
ON      veggies.basketId = baskets.id
WHERE   baskets.Id = 2

这假设fruit.nameveggie.name都不可为空且唯一。

此查询与以前相同,但可以更高效:

SELECT  baskets.*, fruit.name AS fruit, NULL AS veggie
FROM    baskets
JOIN    fruit
ON      fruit.basketId = baskets.id
WHERE   baskets.Id = 2
UNION ALL
SELECT  baskets.*, NULL, veggie.name
FROM    baskets
JOIN    veggies
ON      veggies.basketId = baskets.id
WHERE   baskets.Id = 2
UNION ALL
SELECT  baskets.*, NULL, NULL
FROM    baskets
LEFT JOIN
        fruit
ON      fruit.basketId = baskets.id
LEFT JOIN
        veggies
ON      veggies.basketId = baskets.id
WHERE   baskets.Id = 2
        AND fruit.basketId IS NULL
        AND veggies.basketId IS NULL

,并且不承担任何责任。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM