2010-11-25 32 views
4

在处理查询中不存在的子句时遇到了一些问题。SQL不存在问题

我有三个表:

膳食

no_meal integer 
type_meal varchar(255) 

消耗

no_meal integer 
designation varchar(255) 
quantity integer 

食品

designation varchar(255) 
quantity integer 
type varchar(255) 

食物中的数量是储存的数量,消耗的数量是消费量,所以它们会有所不同,因此自然的内部连接不会削减它。

  • 食物类型可以是'饮料''肉''鱼'等。
  • 类型餐可以是“早餐”“午餐”“晚餐”

我想要一个查询,会告诉我已在所有类型的饭菜被消耗的饮料。

我一直在切换和测试代码,但无法做到正确。目前我正在尝试这个:

SELECT Consumed.designation 
FROM Consumed 
WHERE NOT EXISTS 

(SELECT type_meal 
FROM Consumed, Food, Meal 
WHERE Consumed.designation = Food.designation 
AND Consumed.no_meal = Meal.no_meal 
AND type = 'Drink' 
ORDER BY Food.designation) 

EXCEPT 

(SELECT type_meal 
FROM Meal); 

这到底是怎么回事?

感谢您的输入。

编辑

我会为了更清楚地添加一些数据。

食品

Steak 100 Meat 
Water 200 Drink 
Coca cola 300 Drink 

膳食

0001  Breakfast 
0002  Lunch 
0003  Dinner 

消耗

0001  Water  50 
0002  Steak  20 
0001  Coca cola 20 
0003  Water  5 
0002  Water  15 

现在,我想知道哪些DRI nk已经在每餐中消耗,只会给水。

希望我清除心中的一些有关该问题的

回答

1

扭你的心一点点,并认为用双重否定....

我想[...]已在所有类型的饭菜被消耗的饮料。

你希望所有的饮品其中有没有一顿类型其中,酒后不吃饭类型的一部分:

select distinct f.designation 
from food f 
where 
    type = 'Drink' and 
    not exists (
    select * 
    from meal m1 
    where not exists (
     select * 
     from meal m2 
     join consumed c on c.no_meal = m2.no_meal 
     where 
     m1.no_meal = m2.no_meal and 
     c.designation = f.designation 
    ) 
) 

这就是所谓的relational division

1

现在我明白你想要什么...

SELECT designation 
FROM Food 
WHERE designation IN (
    SELECT designation 
    FROM Consumed 
    GROUP BY designation 
    HAVING Count(DISTINCT no_meal) = (
     SELECT Count(*) FROM Meal 
    ) 
) 
WHERE type = 'Drink' 
+0

此查询不需要数量。我只是把它放在那里,因为它不同,自然的内部连接不能使用。 – Martin 2010-11-25 18:44:02

+0

我需要的是在每种类型的餐中消费的“饮料”类型的食物名称。如果你不使用食物,你怎么区分饮料中的肉和鱼? – Martin 2010-11-25 18:45:21

+0

THANK YOUUUUUUUUUUUUUUUUUUUUUU :) That works;) – Martin 2010-11-25 20:01:04

1

我想要一个查询,会告诉我已在全部被消耗的饮料膳食类型。

您的编辑确实清除了一些东西。请注意,如果Consumed中的组合Designation, Type不是唯一的,那么下面的查询将不起作用,但我猜测它会是。

SELECT 
    c.Designation 
FROM 
    (SELECT 
     c.Designation 
    FROM  
     Consumed c 
    INNER JOIN 
     Meal m ON m.no_meal = c.no_meal 
    GROUP BY 
     c.Designation 
    HAVING 
     COUNT(*) = (SELECT COUNT(*) FROM Meal)) c 
INNER JOIN 
    Food f ON f.Designation = c.Designation 
WHERE 
    f.Type = 'Drink'     
+0

猜猜我没有足够的自我解释。我想要的不是每种饮料中饮料的数量按类型 我想知道是否有任何饮料在所有类型的餐中消耗。 我会将一些示例数据添加到主页面以便更好地解释 – Martin 2010-11-25 18:54:53

+0

编辑完成后,您的原始解释实际上很有意义。我改变了陈述。你能证实结果吗? – 2010-11-25 19:30:51

0
select * 
from food f inner join 
    consumed c_1 on c_1.designation = f.designation 
where type='Drink' and 
not exists -- to filter out drinks that are not a part of all the meals 
(select 1 
from consumed c_2 inner join 
    meal m_1 on m_1.no_meal = c_2.no_meal 
where c_1.no_meal = c2.no_meal and 
     c_1.designation = c2.designation and 
not exists (select 1 
       from meal m_2 
       where m_1.no_meal = m_2.no_meal)) 
0

我想要一个查询,会告诉我已在所有类型的饭菜被消耗的饮料。

这里是模型结构和插入你的建议:

USE SqlTests 
GO 

CREATE TABLE Meal (
    no_meal int 
    , type_meal nvarchar(255) 
) 
GO 

insert into Meal (no_meal, type_meal) 
    values (1, N'Breakfast') 
GO 
insert into Meal (no_meal, type_meal) 
    values(2, N'Lunch') 
GO 
insert into Meal (no_meal, type_meal) 
    values(3, N'Dinner') 
GO 

CREATE TABLE Consumed (
    no_meal int 
    , designation nvarchar(255) 
    , quantity int 
) 
GO 

insert into Consumed (no_meal, designation, quantity) 
    values (1, N'Water', 50) 
GO 
insert into Consumed (no_meal, designation, quantity) 
    values (2, N'Steak', 20) 
GO 
insert into Consumed (no_meal, designation, quantity) 
    values (1, N'Coca cola', 20) 
GO 
insert into Consumed (no_meal, designation, quantity) 
    values(3, N'Water', 5) 
GO 
insert into Consumed (no_meal, designation, quantity) 
    values(2, N'Water', 15) 
GO 

CREATE TABLE Food (
    designation nvarchar(255) 
    , quantity int 
    , [type] nvarchar(255) 
) 
GO 

insert into Food (designation, quantity, [type]) 
    values (N'Water', 200, N'Drink') 
GO 
insert into Food (designation, quantity, [type]) 
    values (N'Steak', 100, N'Meat') 
GO 
insert into Food (designation, quantity, [type]) 
    values (N'Coca cola', 200, N'Drink') 
GO 

然后,所提出的SELECT选择:

select c.designation 
    from Consumed c 
     inner join Meal m on m.no_meal = c.no_meal 
     inner join Food f on f.designation = c.designation and f.[type] LIKE N'Drink' 
    group by c.designation 
     having COUNT(c.designation) = (select COUNT(type_meal) from Meal) 

回报(至少在我的数据库引擎(SQL Server Express的2005年)

Water

我的信息数据是否正确?