[英]Find All Combinations of 2 Directly Unrelated Keys in SQL
我有 3 個表:
大小(列:Id、名稱)
打頂(列:ID,名稱)
披薩(列:Id、SizeId、ToppingId)
Size 和 Topping 僅通過 Pizza 表連接。
我怎樣才能得到比薩表中還沒有的所有可能的大小+配料組合?
前任:
Sizes = {Id: 1, Medium}, {Id: 2, Name: Large}, {Id: 3, Name: X-Large}
Toppings = {Id: 1, Name: Pepperoni}, {Id: 2, Name: Ham}
Pizzas = {Id: 1, SizeId: 2, ToppingId: 1}, {Id: 2, SizeId: 3, ToppingId: 2}
我期望以下 output:
尺碼名稱 | 配料名稱 |
---|---|
中等的 | 意大利辣香腸 |
中等的 | 火腿 |
大 | 火腿 |
特大號 | 意大利辣香腸 |
注意 Large Pepperoni 和 X-Large Ham 沒有出現,因為它們已經在 Pizzas 桌上了
您應該使用EXCEPT
來獲取以下兩組之間的差異:
使用 ids 應該可以使連接更有效率。 一旦你得到帶有 ids 的最終表,你就可以從尺寸和澆頭表中獲取信息。
WITH cte AS (
SELECT *
FROM (SELECT Id AS sizeId FROM sizes ) s
CROSS JOIN (SELECT Id AS toppingId FROM toppings) t
EXCEPT
SELECT sizeId, toppingId FROM pizzas p
)
SELECT s.Name AS size, t.Name AS topping
FROM cte
INNER JOIN sizes s ON cte.sizeId = s.Id
INNER JOIN toppings t ON cte.toppingId = t.Id
您可以使用交叉連接獲取所有可能的大小和頂部 ID 組合,並使用 EXCEPT 運算符從比薩表中存在的組合中“減去”它。 然后你可以簡單地加入 size.id 和 topping.id 上的三個表來獲取名稱。
select s.name, t.name
from (
select size.id sid, topping.id tid
from size cross join topping
EXCEPT
select pizza.sizeid sid, pizza.toppingid tid
from pizza
) AA, size s, topping t
where AA.sid=s.id AND AA.tid=t.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.