存在SQL查询问题
问题描述:
我遇到很多麻烦,最后一个查询我需要,我认为这是我的联盟级别,所以任何帮助表示赞赏。存在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
因为它是仅有的两个食谱足够数量仓库。
编辑:土豆饭不应该出现,因为它是一个配方,但不包含列表
感谢输入时间。欢迎任何帮助:)
答
我会使用>= 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);
答
这是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
)
)
其中用通俗易懂的语言是:“给我那里有没有的成分,所有的食谱数量不足“
请发布您迄今为止编写的代码。人们通常不喜欢只为你写代码。 – 2010-11-26 01:20:46
此外,根据环境的不同,这样做的数据库可能略有不同。 – Payload 2010-11-26 01:36:49
@米奇 我切换使用EXISTS子句,但迷失在嵌套的条款:/ @Payload 这对一个朋友说,问我要做到这一点,它只是为她跟踪的食谱,她可以做的与她的厨房的内容。她有一些滥用储藏室大声笑 – Martin 2010-11-26 01:52:38