簡體   English   中英

無法解決此 SQL 查詢涉及給定電影數據庫的子查詢

[英]Can't solve this SQL query involving subqueries for given film database

關系模式

鑒於上面的關系模式,我似乎無法弄清楚如何解決這個查詢:

  1. 編寫一個 SQL 查詢來查找所有商店都有的電影片名(即,在所有商店的庫存中)。 假設可以有任意數量的商店(即,您不能假設一定數量的商店)。 您的查詢也不能使用 COUNT()。 (提示:使用子查詢查找沒有特定電影的商店並不困難。)

讓我們只定義一個簡化版本的模式,您只提供我們需要的表和列,以及一些要使用的代表性數據。

(為了方便日后參考,您可以通過為我們做這一步來“幫助我們幫助您”。這也表明您已經考慮到了問題涉及的內容)

DECLARE @t_film TABLE
(   film_id INT)

DECLARE @t_store TABLE
(   store_id INT)

DECLARE @t_inventory TABLE
(   inv_id INT IDENTITY,
    store_id INT,
    film_id INT
)

 INSERT INTO @t_film
 VALUES (1),
        (2),
        (3),
        (4),
        (5),
        (6)

 INSERT INTO @t_store
 VALUES (1),
        (2),
        (3),
        (4)

 INSERT INTO @t_inventory
 VALUES (1,1),
        (1,3),
        (1,4),
        (1,5),
        (2,1),
        (2,4),
        (2,5),
        (3,1),
        (3,2),
        (3,3),
        (3,5),
        (4,1),
        (4,2),
        (4,3),
        (4,4),
        (1,6),
        (2,6),
        (3,6),
        (4,6)
-- Every store has films 1 & 6

現在讓我們從他們給你的提示開始,然后從那里開始。 “使用子查詢查找沒有特定電影的商店。”

-- First create a list of every store as if it had every film
SELECT *
  FROM @t_film f
 CROSS JOIN @t_store s
--Then compare that to the actual inventory of each store
  LEFT JOIN @t_inventory i ON f.film_id = i.film_id
                          AND s.store_id = i.store_id
--Then filter that list to only the films which dont appear in a particular store.
 WHERE i.inv_id IS NULL

然后我們可以 select 所有沒有出現在該列表中的電影。 我們將上面的查詢變成一個子查詢,並用它來過濾我們的結果。

SELECT *
  FROM @t_film r
 WHERE film_id NOT IN (SELECT f.film_id
                         FROM @t_film f
                        CROSS JOIN @t_store s
                         LEFT JOIN @t_inventory i ON f.film_id = i.film_id
                                                 AND s.store_id = i.store_id
                        WHERE i.inv_id IS NULL)

可能有更優雅的方法來做到這一點,但我認為這種方法最容易遵循的邏輯。 例如,不使用NOT IN ,您可以使用另一個帶有 NULL 檢查的LEFT JOIN來實現相同的目的。

SELECT r.*
  FROM @t_film r -- result
  LEFT JOIN (SELECT f.film_id
               FROM @t_film f
              CROSS JOIN @t_store s
               LEFT JOIN @t_inventory i ON f.film_id = i.film_id
                                       AND s.store_id = i.store_id
              WHERE i.inv_id IS NULL) inv ON r.film_id = inv.film_id
 WHERE inv.film_id IS NULL

重點是理解邏輯。 從那里您可以找到任意數量的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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