这可能很简单,也很愚蠢,但我现在还没到达那里。我有一个鸡尾酒的数据库,想要检查我可以用可用的成分制作哪些鸡尾酒:
获取每种成分库存的所有鸡尾酒的名称
这些是我的表格:
create table cocktails
(
name TEXT PRIMARY KEY
)
create table ingredients
(
name TEXT PRIMARY KEY
)
create table cocktail_ingredients
(
cocktail_name TEXT ,
ingredient_name TEXT ,
amount INTEGER ,
FOREIGN KEY ( cocktail_name ) REFERENCES cocktails( name ) ,
FOREIGN KEY ( ingredient_name ) REFERENCES ingredients( name )
)
create table ingredients_in_stock
(
ingredient_name TEXT ,
FOREIGN KEY ( ingredient_name ) REFERENCES ingredients ( name )
)
到目前为止,这是我的代码:
SELECT ci.cocktail_name
FROM cocktail_ingredients ci
WHERE ci.ingredient_name IN ( SELECT iis.ingredient_name
FROM ingredients_in_stock iis
)
GROUP BY ci.cocktail_name
HAVING COUNT(*) = ( SELECT COUNT(*)
FROM ingredients_in_stock
)
;
答案 0 :(得分:2)
您可以使用LEFT JOIN和IN子句。像这样:
SELECT name FROM cocktails WHERE Name NOT IN(
SELECT DISTINCT ci.cocktail_name FROM cocktail_ingredients ci LEFT JOIN ingredients_in_stock istk
ON ci.ingredient_name=istk.ingredient_name WHERE istk.ingredient_name IS NULL)
此查询颠倒了逻辑:列出在ingredients_in_stock表中没有遗漏任何成分的鸡尾酒。希望这个想法可以帮助你
答案 1 :(得分:1)
你可以这样说:
select ci.name
from cocktail_ingredients ci
left join ingredients_in_stock iis on iis.ingredient_name = ci.ingredient_name
group by ci.name
having count(ci.ingredient_name) = sum( case
when iis.ingredient_name is not null
then 1
else 0
end
)
在having
子句中,
count(ci.ingredient_name)
为您提供鸡尾酒所需的成分总数
sum()
表达式为您提供鸡尾酒使用的库存成分计数。
答案 2 :(得分:1)
相关子查询应该有效:
select cocktail_name as all_ingredients_in_stock
from cocktail_ingredients ci
inner join ingredients_in_stock iis
on ci.ingredient_name = iis.ingredient_name
group by cocktail_name
having count(*) =
(select count(*)
from cocktail_ingredients
where cocktail_name = ci.cocktail_name
)