Database-Design
創建刪除自 2014 年 12 月 31 日以來未購買過的模型的 DELETE 語句
我們有 5 張桌子。
訂單
Order number (Primary Key) Date of order Customer ID (Primary Key for Customers table) Serial Number (Primary Key for Machines table)
顧客
ID (Primary Key) Name Phone Number Street (ie. 505 Ramapo Valley Road) City (ie. Mahwah) State Zip
機器
Serial Number (Primary Key) Model Number (Primary Key for Models table)
模型
ID (Primary key) Speed RAM HD Price Manufacturer ID (Primary key for Manufacturer table)
製造商
ID (Primary Key) Name Phone Number Email Address
我們的任務是創建一條 SQL 語句,該語句將從 Models 表中刪除自 2014 年 12 月 31 日以來沒有購買過的元組。
以下是我迄今為止設法提出的:
DELETE FROM Model WHERE ID NOT IN ( SELECT Model.ID FROM Model INNER JOIN Machines ON Model.ID = Machines.ModelNo INNER JOIN Orders ON Machines.SerialNo = Orders.SerialNo WHERE OrderDate > 2015 GROUP BY Model.ID );
請讓我知道如何修復此 SQL 語句,我相信問題出在第一行或第二行,或者可能兩者兼而有之。
您的主要問題是您使用的是
INNER JOIN
betweenMachines
,Orders
這意味著只返回匹配的行(換句話說,只返回Orders
存在的行)。相反,您應該使用 aOUTER JOIN
,在這種情況下是 aLEFT OUTER JOIN
(可以簡單地寫為LEFT JOIN
),這樣您就可以獲得 and 的所有行,Models
而Machines
沒有的Orders
行將顯示NULL
表中列的值Orders
。然後,您可以使用該WHERE
子句過濾除行之外的任何內容,而無需像這樣Orders
說:WHERE Orders.SerialNo IS NULL
DELETE FROM Model WHERE ID IN ( SELECT Model.ID FROM Model INNER JOIN Machines ON Model.ID = Machines.ModelNo LEFT JOIN Orders ON Machines.SerialNo = Orders.SerialNo AND Orders.OrderDate >= '2015-01-01' WHERE Orders.SerialNo IS NULL GROUP BY Model.ID );
您遇到的另一個問題是您的
OrderDate
欄位可能不僅僅儲存年份(我假設),因此您需要在進行直接比較時指定整個日期(而不僅僅是年份)。我也在上面的查詢中修復了這個問題。請閱讀我上面連結的資源
LEFT JOINS
以及我在上一篇文章中為您提供的其他資源,特別是了解不同的連接類型以及何時使用它們是非常重要的概念。