[英]Query for a one to many relationship SQL
我有這些桌子
Table FoodName - Table FoodIngredients - Table FoodDescrip
ID | Name - ID | Ingredient - ID | Descrip | IDFoodN | IDIngred
01 | A - 001 | AA - 01 | abcb | 01 | 001
02 | B - 002 | BB - 02 | abcb | 01 | 002
003 | CC 03 | abcb | 01 | 003
04 | abcb | 02 | 001
05 | abcb | 02 | 003
我試過了
Select
f.Name
From
f.FoodName
INNER JOIN
FoodDescrip D ON f.ID = D.ID
INNER JOIN
FoodIngredients I ON I.ID = D.ID
WHERE
Ingredient LIKE NOT ='BB'"
我需要知道不含BB成分的食物,但我需要按成分名稱而不是ID進行搜索。 我試圖使用“成分不喜歡”,但它不起作用。 (我正在使用Inner JOIN)
一種方法使用條件聚合來檢查成分:
SELECT
f1.ID, f1.Name
FROM FoodName f1
INNER JOIN FoodDescrip f2
ON f1.ID = f2.IDFoodN
INNER JOIN FoodIngredients f3
ON f2.IDIngred = f3.ID
GROUP BY
f1.ID, f1.Name
HAVING
SUM(CASE WHEN f3.Ingredient = 'BB' THEN 1 ELSE 0 END) = 0
我會為此使用NOT EXISTS。 (或者不像AB_87的答案那樣輸入。)您的FoodDescrip表是食物和配料之間的交叉引用。 您想要每種與BB成分沒有交叉引用的食物。
SELECT f.Name
FROM FoodName f
WHERE NOT EXISTS
(
SELECT *
FROM FoodDescrip d
JOIN FoodIngredients i ON i.ID = d.IDIngred
AND i.Ingredient = ‘BB’
AND d.IDFoodN = f.ID
)
“選擇所有不屬於該食品和BB成分的食物。”
外部查詢從食物表中選擇,因此您可以返回食物名稱。 NOT EXISTS中的子查詢從交叉引用表連接到成分表,因此您可以找到帶有BB名稱的子查詢,並且也將其過濾為僅包含外部查詢中的食物。 因此,如果在與食物鏈接的子查詢中發現任何BB,則NOT EXISTS將為false,並且WHERE子句將從結果中刪除食物。
可以稍作調整以使用NOT IN代替NOT EXISTS。 基本上是完全相同的方法。 就是這樣:
SELECT f.Name
FROM FoodName f
WHERE f.ID NOT IN
(
SELECT d.IDFoodN
FROM FoodDescrip d
JOIN FoodIngredients i ON i.ID = d.IDIngred
AND i.Ingredient = ‘BB’
)
“選擇ID不在與交叉參考表中的BB成分鏈接的食物ID列表中的所有食物。”
與Tim的方法相比,我更喜歡這些方法,因為我認為它們讀起來更好。 而且,它們的性能可能更好,因為一旦找到一種與BB成分相關的成分,他們就可以從結果中剔除食物。 蒂姆的條件聚合方法要求計算所有匹配項,並查看結果是否等於vs.大於零。
你可以試試看 獲取具有成分“ BB”的FoodId,然后檢索所有之前未檢索到FoodId的食物。
SELECT *
FROM FoodName
WHERE ID NOT IN ( SELECT d.IDFoodN
FROM FoodIngredients i
JOIN FoodDescrip d ON i.ID = d.IDIngred
WHERE i.Ingredient = 'BB' );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.