简体   繁体   English

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

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

Say I have these three tables: 说我有这三个表:

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

It may seem like the second two tables should have just been one table called produce, but in the real situation there is good reason for them to be different tables. 看起来第二个两个表应该只是一个名为produce的表,但在实际情况下,它们有充分的理由成为不同的表。 I need to write a join that returns rows if the basket has rows in either the fruit or veggie tables. 如果篮子在水果或蔬菜表中有行,我需要编写一个返回行的连接。 I thought I could accomplish this with two left joins like so: 我以为我可以通过两个左连接完成此操作:

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;

But this statement returns values in fields that I would like to be empty. 但是这个语句返回我想要为空的字段中的值。 The actual output: 实际输出:

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

The output I would like: 我想要的输出:

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

How can I accomplish this? 我怎么能做到这一点?

You need to union the Fruits and Vegetables table into one relation that you join against, a la: 你需要将水果和蔬菜表联合成一个你加入的关系,一个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;

This query will return no rows if there is nothing in the basket: 如果篮子中没有任何内容,则此查询将不返回任何行:

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

This query will return a single row with two NULLS if there is nothing in the basket: 如果篮子中没有任何内容,此查询将返回带有两个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

This assumes that both fruit.name and veggie.name are not nullable and unique. 这假设fruit.nameveggie.name都不可为空且唯一。

This query is the same as previous but can be more efficient: 此查询与以前相同,但可以更高效:

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

, and does not assume anything. ,并且不承担任何责任。

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

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