我有四个(相关)表
CAKETABLE
CAKE ICING
RESERVEDSPRINKLES
CAKE SPRINKLE
SPRINKLETABLE
SPRINKLE CONSUMED
ICINGTABLE
ICING CONSUMED
每个蛋糕恰好有3洒和1糖霜。
我想查询数据库并获取所有有1个糖霜和3个糖霜的蛋糕,这些糖霜或任何糖霜都没有CONSUMED ='1'。
因此,让我们psuedo插入数据:
插入ICINGTABLE(香草,0),(巧克力,0);
INSERT INTO SPRINKLETABLE (red, 0), (blue, 0), (green, 0), (orange, 0), (purple, 0),(pink, 0);
INSERT INTO CAKETABLE (cake1, vanilla), (cake2, chocolate);
INSERT INTO RESERVEDSPRINKLES (cake1, red), (cake1, blue), (cake1, green), (cake2, orange), (cake2, purple), (cake2, pink);
因此,现在我有一块带有香草糖衣的cake1和红色,蓝色,绿色的糖粉,还有一块有巧克力糖衣的cake2和橙色,紫色和粉红色的糖粉。
当我运行查询时,我希望它返回
CAKES
cake1
cake2
仅在蛋糕中没有消耗的部分的情况下,因此,即使标记为“一滴”,我也要从查询中忽略整个蛋糕。
以下查询恰好可以锦上添花。
SELECT CAKE
FROM CAKETABLE as c
INNER JOIN (SELECT * FROM ICINGTABLE WHERE CONSUMED = '0') as i
ON c.ICING = i.ICING;
但是由于洒水,我遇到了麻烦。如果使用与上述相同的技术,我的查询将返回:
CAKE
cake1
cake1
cake1
cake2
cake2
cake2
我可以用DISTINCT消除它,但是它仍然不正确,因为如果有任何消耗掉的巧克力='0',当我想要相反的功能时,它会在列表中显示蛋糕(仅在所有消耗掉的巧克力='0'的情况下显示蛋糕)
如果有人对此有更好的标题名称,将不胜感激。我想不出任何描述性和简短的内容。
最佳答案
您可以使用not exists
要求不消耗糖霜或糖霜:
select cake
from caketable c
where not exists
(
select *
from icingtable i
where i.cake = c.cake
and i.consumed = '1'
)
and not exists
(
select *
from sprinkletable s
where s.cake = c.cake
and s.consumed = '1'
)