我有四个(相关)表

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

09-30 09:24