SQL :如何检查 table 的所有条目是否在另一个 table 中

SQL : how to check if all entries of a table are in another table

我正在尝试制作一个程序,用户可以在其中输入他们家中的食材,系统会给出他们可以只使用这些食材制作的食谱。

Table 种制作食谱所需的原料。 'recipe_ingredients'

+----------------+---------------+-----------------+
| curr_recipe_id | ingredient_id | ingredient_name |
+----------------+---------------+-----------------+
|              1 |             1 | ingredient 1    |
|              1 |             2 | ingredient 2    |
|              1 |             3 | ingredient 3    |
|              1 |             4 | ingredient 4    |
|              2 |             5 | ingredient 5    |
|              2 |             6 | ingredient 6    |
|              2 |             7 | ingredient 7    |
|              2 |             8 | ingredient 4    |
|              2 |             9 | ingredient 2    |
|              2 |            10 | ingredient 8    |
|              2 |            11 | ingredient 9    |
|              2 |            12 | ingredient 10   |
+----------------+---------------+-----------------+

Table 个食谱

+-----------+----------------------+
| recipe_id | name                 |
+-----------+----------------------+
|         1 | recipe 1             |
|         2 | recipe 2             |
+-----------+----------------------+

Table家里的食材: 'home_ing'

+---------------+
| home_ing_name |
+---------------+
| ingredient 1  |
| ingredient 2  |
| ingredient 3  |
| ingredient 4  |
+---------------+

我想得到所有我能用家里的原料做的食谱。

我应该得到什么作为输出:

Table 种可能的家庭配料食谱:

+----------------+
| recipe id      |
+----------------+
|              1 |
+----------------+

我试过使用这个查询:

select * 
from recipes
where recipe_id in (select curr_recipe_id 
                    from recipe_ingredients 
                    where ingredient_name) in (select home_ing_name from home_ing));    

这个查询returns:

+----------------+
| recipe id      |
+----------------+
|              1 |
|              2 |
+----------------+

因为我家的食材table含有食谱2的其中一种食材

您可以:

Select recepi_id, MIN(HaveIngredient) from(
Select IR.recepi_id, Case when IH.home_ing_name is null then 0 else 1 end as HaveIngredient
from tableOfInredients IR
Left join tableOfIngredientsAtHome IH 
on IR.Ingredient_Name = IH.Home_ing_name) tmp
group by recepi_id
having MIN(HaveIngredient) = 1

这里的第一步是将我拥有的配料加入收据清单。如果我有成分,如果不是 0,我将标记为 1。

然后我只希望每个 recepi 有一行,并且我 select recepi_Id 的 MIN 值为 HaveIngredient 值。在有条款 I select 只是所有成分都在家的地方。

此查询获取输入中提供的成分 不满足 的所有 recipe_ingredient 记录,并从中获取所有不符合的食谱在该列表中。

SELECT r.recipe_id
FROM recipe r
WHERE NOT EXISTS(
   SELECT * FROM recipe_ingredient ri   
   WHERE ri.recipe_id = r.recipe_id
   AND NOT EXISTS(
       /* making the assumption here that the list of ingredients you have is provided
          in some form of input that can be placed in temp table or similar */
       SELECT * FROM #my_ingredients mi
       WHERE mi.ingredient_id = ri.ingredient_id
   )
)

这里与其他方法的主要区别在于,它将 return 没有 任何 成分的食谱,这取决于您的要求可能会或可能不理想。

SELECT 
   recipe_id,
   name
FROM recipe
WHERE recipe_id NOT IN (
   SELECT recipe_id
   FROM recipe_ingredients ri
   LEFT JOIN home_ing h ON h.home_ing_name = ri.ingredient_name
   WHERE home_ing_name IS NULL)

这个 SQL 列出了没有(NOT IN)不匹配成分的所有食谱。 sub-query 将找到 non-existing home_ingredients 所需的食谱。

参见:DBFIDDLE