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