[英]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.name
和veggie.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.