2010-11-26 48 views
0

我遇到很多麻烦,最后一个查询我需要,我认为这是我的联盟级别,所以任何帮助表示赞赏。存在SQL查询问题

的表格:

Food
CREATE TABLE Recipe 
(
    nrecipe  integer, 
    name   varchar(255), 
    primary key (nrecipe) 
); 

CREATE TABLE Food 
(
    designation varchar(255) unique, 
    quantity  integer, 
    primary key (designation) 
); 

CREATE TABLE Contains 
(
    nrecipe  integer, 
    designation varchar(255), 
    quantity  integer, 
    primary key (nrecipe, designation), 
    foreign key (nrecipe) references Recepie (nrecipe), 
    foreign key (designation) references Food (designation) 
); 

Quantity表是存储在仓库中的量。

Quantity in Contains是食物元素在配方中使用所需的量。

Quantity in Food表和Contains彼此不同。

查询:

我想知道所有的食谱是可能的名称与存储在仓库中的食品来完成。

它要求仓库食品中每一种元素的数量都大于食谱所需的数量。

编辑:另外,它不应该显示食谱的名称,如果没有任何提及它在Contains表。

为了便于理解,我给了一些数据:

INSERT INTO Recipe VALUES ('01', 'Steak with potatos and water'); 
INSERT INTO Recipe VALUES ('02', 'Rice and ice tea'); 
INSERT INTO Recipe VALUES ('03', 'Potatos and shrimp'); 
INSERT INTO Recipe VALUES ('04', 'Water'); 
INSERT INTO Recipe VALUES ('05', 'Steak with rice'); 
INSERT INTO Recipe VALUES ('06', 'Steak with spaguetti'); 
INSERT INTO Recipe VALUES ('07', 'Potatos with rice'); 

INSERT INTO Food VALUES ('Water', 5); 
INSERT INTO Food VALUES ('Ice tea', 10); 
INSERT INTO Food VALUES ('Steak', 30); 
INSERT INTO Food VALUES ('Potatos', 20); 
INSERT INTO Food VALUES ('Rice', 50); 
INSERT INTO Food VALUES ('Shrimp', 5); 
INSERT INTO Food VALUES ('Spaguetti', 5); 

INSERT INTO Contains VALUES ('01', 'Steak', 1); 
INSERT INTO Contains VALUES ('01', 'Potatos', 15); 
INSERT INTO Contains VALUES ('01', 'Water', 10); 
INSERT INTO Contains VALUES ('02', 'Rice', 5); 
INSERT INTO Contains VALUES ('02', 'Ice tea', 8); 
INSERT INTO Contains VALUES ('03', 'Potatos', 1); 
INSERT INTO Contains VALUES ('03', 'Shrimp', 10); 
INSERT INTO Contains VALUES ('04', 'Water', 20); 
INSERT INTO Contains VALUES ('05', 'Steak', 1); 
INSERT INTO Contains VALUES ('05', 'Rice', 20); 
INSERT INTO Contains VALUES ('06', 'Steak', 1); 
INSERT INTO Contains VALUES ('06', 'Spaguetti', 10); 

从查询期望的结果是:

Rice and ice tea 
Steak with rice 

因为它是仅有的两个食谱足够数量仓库。

编辑:土豆饭不应该出现,因为它是一个配方,但不包含列表

感谢输入时间。欢迎任何帮助:)

+0

请发布您迄今为止编写的代码。人们通常不喜欢只为你写代码。 – 2010-11-26 01:20:46

+0

此外,根据环境的不同,这样做的数据库可能略有不同。 – Payload 2010-11-26 01:36:49

+0

@米奇 我切换使用EXISTS子句,但迷失在嵌套的条款:/ @Payload 这对一个朋友说,问我要做到这一点,它只是为她跟踪的食谱,她可以做的与她的厨房的内容。她有一些滥用储藏室大声笑 – Martin 2010-11-26 01:52:38

回答

2

我会使用>= ALL操作:

SELECT name 
    FROM Recipe R 
WHERE 0 >= ALL (SELECT C.quantity - F.quantity 
        FROM Food F 
      INNER JOIN Contains C 
        USING (designation) 
        WHERE C.nrecipe = R.nrecipe); 

正确的拼写是秘方,你的一些列(recepie,nrecipe,nrecepie)使用不同的名称,所以我改变了它。请注意,不应使用varchar主键,而应使用数字键。

编辑:

SELECT name 
    FROM Recipe R 
WHERE 0 >= ALL (SELECT C.quantity - F.quantity 
        FROM Food F 
      INNER JOIN Contains C 
        USING (designation) 
        WHERE C.nrecipe = R.nrecipe) 
    AND EXISTS(SELECT NULL 
       FROM Contains C 
       WHERE C.nrecipe = R.nrecipe); 
0

这是SQL Server,因为这是我有:

select 
    r.name 
from 
    Recepie r 
where 
    not exists 
    (
     select 1 
     from 
      [Contains] c 
     where 
      c.nrecipe = r.nrecepie and 
      not exists 
      (
       select 1 
       from 
        Food f 
       where 
        f.designation = c.designation and 
        f.quantity >= c.quantity 
      ) 
    ) 

其中用通俗易懂的语言是:“给我那里有没有的成分,所有的食谱数量不足“