2017-07-30 84 views
1

大家晚上好,SQL請求錯誤

我工作的一個任務,不能弄清楚下面,我有兩個表:

CREATE TABLE Rental (
rental_id DECIMAL(12) PRIMARY KEY, 
customer_id DECIMAL(12), 
movie_id DECIMAL(12), 
delivery_status VARCHAR(64), 
return_status VARCHAR(64)); 

CREATE TABLE Movie (
movie_id DECIMAL(12) PRIMARY KEY, 
DVD_id INTEGER NOT NULL, 
title VARCHAR(64) NOT NULL, 
stock_number DECIMAL(12), 
director_id DECIMAL(12), 
genre_id DECIMAL(12), 
release_date DATE NOT NULL, 
restrictions VARCHAR(256) NOT NULL); 

我需要執行以下操作,列出當前不可用,租用且尚未返回的所有電影的名稱。這是我的查詢:

SELECT Movie.movie_id, Movie.title, Movie.stock_number 
FROM Movie 
WHERE (Movie.movie_id, Movie.stock_number) NOT IN (
SELECT Rental.movie_id, 
COUNT(Rental.return_status) AS number_of_unreturned 
FROM Rental 
WHERE Rental.return_status = 'Unreturned' 
GROUP BY Rental.movie_id 
HAVING COUNT (Rental.return_status) > 1) AND Movie.stock_number = 0; 

我肯定在電影表中都沒有「Unreturend」的電影,但我得到no rows selected所有的時間。任何意見或指導思考將不勝感激。謝謝!

我編輯了這篇文章,並添加了表格的內容。

INSERT INTO Movie VALUES (1, 1, 'Amblin', 1, 1, 1, CAST('18-Dec-1968' AS DATE), 'G'); 
INSERT INTO Movie VALUES (2, 2, 'Duel', 2, 1, 2, CAST('13-Nov-1971' AS DATE), 'R'); 
INSERT INTO Movie VALUES (3, 3, 'Something Evil ', 3, 1, 3, CAST('21-Jan-1972' AS DATE), 'R'); 
INSERT INTO Movie VALUES (4, 4, 'The Sugarland Express ', 4, 1, 4, CAST('05-Apr-1974' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (5, 5, 'Jaws', 5, 1, 3, CAST('20-Jun-1975' AS DATE), 'R'); 
INSERT INTO Movie VALUES (6, 6, 'Close Encounters of the Third Kind', 6, 1, 5, CAST('16-Nov-1977' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (7, 7, ' 1941', 7, 1, 6, CAST('14-Dec-1979' AS DATE), 'G'); 
INSERT INTO Movie VALUES (8, 8, 'Raiders of the Lost Ark', 8, 1, 7, CAST('12-Jun-1981' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (9, 9, 'E.T. the Extra-Terrestrial', 9, 1, 5, CAST('11-Jun-1982' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (10, 10, 'Twilight Zone: The Movie', 10, 1, 3, CAST('24-Jun-1983' AS DATE), 'R'); 
INSERT INTO Movie VALUES (11, 11, 'Indiana Jones and the Temple of Doom', 11, 1, 7, CAST('23-May-1984' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (12, 12, 'The Color Purple', 12, 1, 4, CAST('18-Dec-1985' AS DATE), 'G'); 
INSERT INTO Movie VALUES (13, 13, 'Empire of the Sun', 13, 1, 4, CAST('25-Dec-1987' AS DATE), 'G'); 
INSERT INTO Movie VALUES (14, 14, 'Always', 14, 1, 4, CAST('22-Dec-1989' AS DATE), 'G'); 
INSERT INTO Movie VALUES (15, 15, 'Indiana Jones and the Last Crusade', 15, 1, 7, CAST('24-May-1989' AS DATE), 'G'); 
INSERT INTO Movie VALUES (16, 16, 'Hook', 16, 1, 8, CAST('11-Dec-1991' AS DATE), 'G'); 
INSERT INTO Movie VALUES (17, 17, 'Jurassic Park ', 17, 1, 5, CAST('11-Jun-1993' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (18, 18, 'Schindler''s List', 18, 1, 4, CAST('15-Dec-1993' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (19, 19, 'The Lost World: Jurassic Park', 19, 1, 5, CAST('23-May-1997' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (20, 20, 'Amistad', 20, 1, 4, CAST('10-Dec-1997' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (21, 21, 'Saving Private Ryan', 21, 1, 4, CAST('24-Jul-1998' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (22, 22, 'A.I. Artificial Intelligence', 22, 1, 4, CAST('29-Jun-2001' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (23, 23, 'Minority Report', 23, 1, 7, CAST('21-Jun-2002' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (24, 24, 'Catch Me If You Can', 24, 1, 8, CAST('25-Dec-2002' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (25, 25, ' The Terminal', 25, 1, 4, CAST('18-Jun-2004' AS DATE), 'G'); 
INSERT INTO Movie VALUES (26, 26, 'War of the Worlds', 26, 1, 5, CAST('29-Jun-2005' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (27, 27, 'Munich', 27, 1, 4, CAST('23-Dec-2005' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (28, 28, 'Indiana Jones and the Kingdom of the Crystal Skull', 28, 1, 7, CAST('22-May-2008' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (29, 29, 'The Adventures of Tintin', 28, 1, 7, CAST('21-Dec-2011' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (30, 30, 'War Horse', 30, 1, 4, CAST('25-Dec-2011' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (31, 31, 'Lincoln', 31, 1, 4, CAST('09-Nov-2012' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (32, 32, 'Bridge of Spies', 32, 1, 4, CAST('16-Oct-2015' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (33, 33, 'The BFG', 33, 1, 8, CAST('01-Jul-2016' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (34, 34, 'Praying with Anger', 34, 2, 5, CAST('12-Sep-1992' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (35, 35, 'Wide Awake', 35, 2, 4, CAST('20-Mar-1998' AS DATE), 'G'); 
INSERT INTO Movie VALUES (36, 36, 'The Sixth Sense', 36, 2, 2, CAST('06-Aug-1999' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (37, 37, 'Unbreakable', 37, 2, 2, CAST('22-Nov-2000' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (38, 38, 'Signs', 38, 2, 2, CAST('02-Aug-2002' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (39, 39, 'The Village', 39, 2, 2, CAST('30-Jul-2004' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (40, 40, 'Lady in the Water', 40, 2, 8, CAST('21-Jul-2006' AS DATE), 'PG13'); 
INSERT INTO Movie VALUES (41, 41, 'The Happening', 41, 2, 2, CAST('13-Jun-2008' AS DATE), 'R'); 
INSERT INTO Movie VALUES (42, 42, 'The Last Airbender', 42, 2, 7, CAST('02-Jul-2010' AS DATE), 'G'); 
INSERT INTO Movie VALUES (43, 43, 'After Earth', 43, 2, 7, CAST('31-May-2013' AS DATE), 'G'); 
INSERT INTO Movie VALUES (44, 44, 'The Visit', 44, 2, 3, CAST('11-Sep-2015' AS DATE), 'R'); 
INSERT INTO Movie VALUES (45, 45, 'Split', 45, 2, 2, CAST('20-Jan-2017' AS DATE), 'PG13'); 

INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 1, 1, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 2, 1, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 3, 6, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 4, 7, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 2, 2, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 2, 37, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 1, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 24, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 3, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 13, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 2, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 8, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 1, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 2, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 3, 'Delivered', 'Unreturned'); 
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 3, 27, 'Delivered', 'Returned'); 

很抱歉,如果這是一個太長職位。

+0

你可以放入單詞,這是一個電影不可用的條件? – Juan

+0

如果電影的所有副本當前都已出租且尚未返回,則電影已售罄。這就是教科書中提到的所有問題,所以我提出瞭解決方案。 – nickkislak

+0

你可以做一個sqlfiddle嗎? – Woot4Moo

回答

0

請嘗試,如果這個邏輯是正確的,我不太明白列的命名。您可能會更改最後一行(having)以更正它。

SELECT 
    m.movie_id, m.title, m.stock_number -- Getting movie id, movie title, stock number 
FROM Movie m       -- from movie table 
JOIN rental r 
    ON (m.movie_id = r.movie_id)  -- joining rental table in movie_id 
WHERE 
    r.return_status = 'Unreturned'  -- where return_status is unreturned 
GROUP BY 
    m.movie_id, m.title, m.stock_number -- grouping_by (same as select) 
HAVING 
    SUM(r.movie_id) > m.stock_number; -- restricting group by quantity 
+0

謝謝,但我不認爲這是正確的,查詢假設給我的電影#1,2,3,6,7,8,13,24,37,因爲他們目前只是租用,沒有返回。那只是看着桌子。正確的查詢將是:'SELECT Movie.movi​​e_id,Movie.title,Movie.stock_number FROM Movie JOIN Rental ON(movie.movi​​e_id = Rental.movi​​e_id) WHERE Rental.return_status ='Unreturned' GROUP BY Movie.movi​​e_id ,Movie.title,Movie.stock_number ORDER BY Movie.movi​​e_id;' – nickkislak

+0

你如何確定'不可用,租用,還沒有返回' - 我不太瞭解邏輯。 – fg78nc

+0

這不是真正的世界邏輯,這是一本書所要求的,所以它是模擬一種可能的情況。 – nickkislak

1

我不想寫代碼,因爲你是學生。我會給一些方向。在您的where子句中你比較(movie.movi​​e_id = rental.movi​​e_id)和(movie.stock_number =計數(rental.return_status)的stock_number相較於收益的數量是不正確。

  1. 當返回列在多個表中使用連接,在聲明中進行比較,計數未被返回
  2. 加入電影和movie_id中的「in」子查詢在子查詢上創建一個別名,以便您可以加入它
  3. 將計數列添加到最上面的外部選擇
0

要解決查詢首先嚐試將其分解到您需要的組件中。

在這種情況下,您需要比較租借電影的數量和電影的數量。

所以寫2個separte查詢:

1 - 一個將提供電影ID,並在股票電影的數量。
2 - 另一個用於電影ID和租借數量。對於這一個,你必須指望沒有反應。

有了這兩個查詢之後,您可以將它們用作高級別查詢的子查詢,該查詢將每個或這些查詢視爲由公共ID字段連接的表。
並添加比較庫存和計數字段的where子句。

實施例:

表A:ID,姓名,年齡
表B:table_b_id,table_a_id,電話,地址

查詢1:選擇ID,名稱,從A
查詢2年齡:選擇table_a_id,電話,地址B

select Q1.id, Q1.name, Q1.age, Q2telephone, Q2.address 
from 
    (select A.id, A.name, A.age from A) Q1, 
    (select B.table_a_id, B.telephone, B.address from B) Q2 
where 
Q1.id = Q2.table_a_id 
+0

謝謝,我欣賞一個詳細的解釋。 – nickkislak