说我有一个叫作食材的桌子,其中包含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
我希望这是一个视图,所以我不能使用子查询...
答案 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