Database-Design

創建刪除自 2014 年 12 月 31 日以來未購買過的模型的 DELETE 語句

  • March 2, 2021

我們有 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 JOINbetween MachinesOrders這意味著只返回匹配的行(換句話說,只返回Orders存在的行)。相反,您應該使用 a OUTER JOIN,在這種情況下是 a LEFT OUTER JOIN(可以簡單地寫為LEFT JOIN),這樣您就可以獲得 and 的所有行,ModelsMachines沒有的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以及我在上一篇文章中為您提供的其他資源,特別是了解不同的連接類型以及何時使用它們是非常重要的概念。

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