[英]Can't solve this SQL query involving subqueries for given film database
鑒於上面的關系模式,我似乎無法弄清楚如何解決這個查詢:
讓我們只定義一個簡化版本的模式,您只提供我們需要的表和列,以及一些要使用的代表性數據。
(為了方便日后參考,您可以通過為我們做這一步來“幫助我們幫助您”。這也表明您已經考慮到了問題涉及的內容)
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.