SQL选择列表关系作为表

SQL选择列表关系作为表,sql,postgresql,Sql,Postgresql,Postgres数据库包含3个表: recipes(id,recipe_name) ingredients(id,ingredient_name) recipes_ingredients(recipe_id,ingredient_id) 是否有任何方法可以编写一个动态sql select来创建一个配方列表,其中配料表中的每种配料都有一列,如果它与配方相关,那么该列中的每种配料都有一个yes 比如: 让它显示0或1好的,但有没有一种简单的方法使它动态,这样我就不必更新配料表中的每一项 SELEC

Postgres数据库包含3个表:

recipes(id,recipe_name)
ingredients(id,ingredient_name)
recipes_ingredients(recipe_id,ingredient_id)
是否有任何方法可以编写一个动态sql select来创建一个配方列表,其中配料表中的每种配料都有一列,如果它与配方相关,那么该列中的每种配料都有一个yes

比如:

让它显示0或1好的,但有没有一种简单的方法使它动态,这样我就不必更新配料表中的每一项

SELECT 
DISTINCT r.recipe_name,
(SELECT COUNT(*) FROM recipes_ingredients WHERE ingredient_id = 1 AND recipe_id = ri.recipe_id) as Tomato,
(SELECT COUNT(*) FROM recipes_ingredients WHERE ingredient_id = 2 AND recipe_id = ri.recipe_id) as Mustard,
(SELECT COUNT(*) FROM recipes_ingredients WHERE ingredient_id = 3 AND recipe_id = ri.recipe_id) as Cucumber,
(SELECT COUNT(*) FROM recipes_ingredients WHERE ingredient_id = 4 AND recipe_id = ri.recipe_id) as Flour
FROM recipes r
INNER JOIN recipes_ingredients ri on ri.recipe_id = r.id
INNER JOIN ingredients i on i.id = ri.ingredient_id
ORDER BY r.recipe_name

按配方名称分组,然后选择案例最大成分名称,其中成分名称=成分 像这样的

SELECT 
r.recipe_name,
CASE WHEN MAX(i.ingredient_name) = 'Tomato' THEN 'Yes' ELSE 'No' END as Tomato
FROM recipes_ingredients ri
INNER JOIN recipes r on r.id = ri.recipe_id
INNER JOIN ingredients i on i.id = ri.ingredient_id
GROUP BY r.recipe_name
案例会随着成分数量的增加而增加


或者,您可以尝试使用SQL pivot来实现更精确的交叉表函数,按配方名称分组,然后选择case max component\u name where component\u name=component 像这样的

SELECT 
r.recipe_name,
CASE WHEN MAX(i.ingredient_name) = 'Tomato' THEN 'Yes' ELSE 'No' END as Tomato
FROM recipes_ingredients ri
INNER JOIN recipes r on r.id = ri.recipe_id
INNER JOIN ingredients i on i.id = ri.ingredient_id
GROUP BY r.recipe_name
案例会随着成分数量的增加而增加


或者您可以尝试使用SQL pivot来实现更精确的交叉表功能,您需要的是postgresql中的
交叉表
,或者mssql中的
pivot
。有关动态sql解决方案,请参阅本文(这对我来说最合适):,其他选项,请参阅以下问题:

您需要的是postgresql中的
交叉表或
pivot
ing mssql。对于动态sql解决方案,请参阅此帖子(这对我来说最合适):,其他选项,请参阅此问题:

谢谢-我一直在寻找动态解决方案,因为新的“成分”不断添加,但我可以使用它-问题是我在所有情况下都得到“否”,即使应该是“是”,使用动态sql动态生成包含所有成分的查询,此查询只是如何将行转换为列谢谢-我一直在寻找一个动态解决方案,因为添加了新的“成分”,但我可以使用它-问题是我在所有情况下都会得到“否”,即使应该是“是”,也可以使用动态sql动态生成包含所有成分的查询,此查询只是如何将行转换为列