簡體   English   中英

在 SQL 中查找 2 個直接無關鍵的所有組合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM