鸡尾酒db的SELECT语句

时间:2014-09-07 21:08:33

标签: sql

这可能很简单,也很愚蠢,但我现在还没到达那里。我有一个鸡尾酒的数据库,想要检查我可以用可用的成分制作哪些鸡尾酒:

  

获取每种成分库存的所有鸡尾酒的名称

这些是我的表格:

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
                  )
;

3 个答案:

答案 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
)

Sample SQL Fiddle