簡體   English   中英

查詢一對多關系SQL

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM