Sql-Server

多個子查詢中的複雜連接

  • April 20, 2017

很抱歉一直打擾你們,但 SQL 對我來說仍然是新的。我有這些表:Store_location、Product、Size、Sells、Available_in、Offers 和 Currency。目標是能夠執行一個包含多個子查詢(需要WHERE子句)的查詢,該查詢將僅返回在所有商店位置銷售的產品,而不返回其他任何東西。它還必須具有可擴展性,以便在任何商店打開或關閉時無需更改程式碼。我有這些雜念讓我開始,但我不知道從哪裡開始:下面的第一個 select 語句是查詢成功時需要顯示的內容。SELECT Store_location.store_name,Product.product_name,Sizes.size_option, COUNT(store_location.store_id) AS store_count

JOIN Sells ON Sells.store_location_id = Store_location.store_location_id
JOIN Product ON Product.product_id = Sells.product_id


JOIN ON Available_in.product_id = Product.product_id
JOIN ON Available_in.sizes_id = Sizes.sizes_id

我試圖完成連接以顯示我需要使用的表在哪裡具有外鍵約束。如果您需要任何其他資訊,我可以提供。我添加了一個連結,顯示所有相關表格的內容。我知道我需要在 WHERE 語句中嵌入至少一個子查詢,但不確定在其中放入什麼。我知道有很多資訊需要查看,我理解如果沒有人有時間提供幫助,但任何指導都將不勝感激。

我意識到這是一個遲到的請求,但如果有人可以幫助我在這方面也使用EXISTS,我將不勝感激。

如果要找出所有商店都出售哪些產品,這似乎是最困難的部分。與大多數事情一樣,有不止一種方法可以做到這一點,但以下查詢應返回在所有商店出售的所有產品 ID:

SELECT product_id
 FROM Product
EXCEPT -- exclude product IDs that are not sold in all stores
SELECT product_id
 FROM (-- Generate list of product IDs and the stores that do NOT sell them
       -- select all possible products and stores ...
       SELECT product_id, store_id
         FROM Product CROSS JOIN Store_location
       EXCEPT -- ... for the products actually sold by each store
       SELECT product_id, store_id
         FROM Sells
      ) Not_At_All_Stores

子查詢獲取所有可能的產品和商店的列表,並刪除代表在相關商店中實際銷售的產品的組合。這只留下不在指定商店出售的產品。

然後,我們獲取完整的產品列表,並刪除我們(現在)知道至少在一家商店沒有銷售的任何產品。這只剩下在所有商店出售的產品。

從這裡開始,只需將所有內容連接在一起即可。你會得到一個像這樣的 FROM 子句:

SELECT Store_location.store_name
     ,Product.product_name
     ,Sizes.size_option
 FROM (
       SELECT product_id
         FROM Product
       EXCEPT -- exclude product IDs that are not sold in all stores
       SELECT product_id
         FROM (-- Generate list of product IDs and the stores that do NOT sell them
               -- select all possible products and stores ...
               SELECT product_id, store_id
                 FROM Product CROSS JOIN Store_location
               EXCEPT -- ... for the products actually sold by each store
               SELECT product_id, store_id
                 FROM Sells
              ) Not_At_All_Stores
      ) uprod -- for a Universally sold PRODuct
        INNER JOIN Product ON (uprod.product_id = Product.product_id)
        INNER JOIN Available_in ON (uprod.product_id = Available_in.product_id
          INNER JOIN Sizes ON (Available_in.size_id = Sizes.size_id)
        INNER JOIN Sells ON (uprod.product_id = Sells.product_id)
          INNER JOIN Store_location ON (Sells.store_id = Store_location.store_id)
ORDER BY store_name, product_name, size_option

不需要任何WHERE條款(根據您的要求)。請注意,商店資訊是多餘的 - 因為這些產品在所有商店都有銷售,所以您只會得到相同基礎結果的 5 個副本,每個副本前面都附加了 5 個商店名稱中的一個。對於並非在每家商店都出售的產品,商店名稱更有趣。

注意:根據您的Product表的索引方式,您可以將該product_name列添加到Not_At_All_Stores子查詢中,並從那裡進行。但是,這確實意味著我們必須將它包含在我們所有可能的產品和商店的列表中,這會在執行我們的 EXCEPT 操作時消耗更多的記憶體。

更新:從您的最新評論來看,顯然此分配要求您使用 WHERE 子句、WHERE 子句中的子查詢和 EXISTS。從這裡到達那裡:

  • uprod從查詢中刪除;任何連結到的東西都uprod.product_id應該連結到Product.product_id
  • 使用可能回答中的第一個查詢作為您的子查詢;
  • 您想要 product_id 存在於子查詢中的記錄。

由於這一個家庭作業,我會讓你實際組裝它,至少。

使用我的答案中的第一個查詢作為您的 sub_query,並查找產品

引用自:https://dba.stackexchange.com/questions/171424