SQL-查找每个父级的未使用查找值

时间:2018-06-20 15:05:39

标签: sql

说我有一个叫作食材的桌子,其中包含5种不同的比萨馅料。

1:1

然后我有一个Pizza表和PizzaTopping表(链接到Ingredient)。这两个表描述了已制成和出售的比萨饼。


现在,对于每个比萨饼,我想显示所有我所售出的比萨饼都没有使用的成分。例如,如果Pizza 1是火腿,菠萝和香蕉(即未使用成分4和5),而Pizza 2是Pinepple,巧克力和番茄(例如,未使用成分1和3),我会看到以下信息:

1. Ham
2. Pineapple
3. Banana
4. Chocolate
5. Tomato

我希望这是一个视图,所以我不能使用子查询...

1 个答案:

答案 0 :(得分:1)

将所有比萨饼与所有食材一起加入,然后用NOT EXISTS过滤实际使用的比萨饼。

SELECT
    P.Pizza,
    I.Ingredient
FROM
    Pizza P
    CROSS JOIN Ingredient I
WHERE
    NOT EXISTS (SELECT 'ingredient not used' FROM PizzaTopping T WHERE T.Pizza = P.Pizza AND I.Ingredient = T.Ingredient)

编辑:对于SQL Server索引视图:

SELECT
    P.Pizza,
    I.Ingredient
FROM
    Pizza P
    CROSS JOIN Ingredient I
    LEFT JOIN PizzaTopping T ON 
        T.Pizza = P.Pizza AND 
        I.Ingredient = T.Ingredient
WHERE
    T.Pizza IS NULL