設定條件刪除資料列

SELECT * FROM PurchasesDetail ORDER BY ParentId , ProductNo
DELETE FROM PurchasesDetail WHERE Qty < 12
SELECT * FROM PurchasesDetail ORDER BY ParentId , ProductNo 

執行 SQL 指令:

SELECT * FROM PurchasesDetail ORDER BY ParentId , ProductNo
DELETE FROM PurchasesDetail WHERE Qty < 12

刪除 Qty < 12,執行 SQL 指令: DELETE FROM PurchasesDetail WHERE Qty < 12


Id =1 與 Id = 3 被刪除。

刪除符合子查詢條件的資料列

刪除條件來自另一個 Table

--商品標準單價設定檔
SELECT * FROM StandardPrice ORDER BY ProductNo
--商品銷售記錄檔
SELECT SalesRecord.* StandardPrice.StandardPrice
SalesRecord.SalePrice - StandardPrice.StandardPrice AS DifferencePrice
FROM SalesRecord
LEFT OUTER JOIN StandardPrice ON StandardPrice.ProductNo = SalesRecord.ProductNo
ORDER BY SalesRecord. Id
--商品銷售單價低於標準單價記錄
SELECT * FROM SalesRecord WHERE SalePrice <
(SELECT StandardPrice FROM StandardPrice WHERE ProductNo = SalesRecord.ProductNo)
ORDER BY Id
--刪除商品銷售單價低於標準單價記錄
DELETE FROM SalesRecord WHERE SalePrice <
(SELECT StandardPrice FROM StandardPrice WHERE ProductNo = SalesRecord.ProductNo)
--刪除後商品銷售記錄檔
 
  1. 查詢商品標準單價

    SELECT * FROM StandardPrice ORDER BY ProductNo

  2. 同時顯示 商品標準單價StandardPrice與商品銷售記錄SalesRecord,發現有一筆銷後有異常,編號 D03 商品標準單價 100, 但銷售紀錄上發現曾經有一筆 90 的銷售紀錄。低於標準價 ? 賠錢

    SELECT * FROM StandardPrice ORDER BY ProductNo
    SELECT * FROM SalesRecord
    :

  3. 這現象可能當初程式沒寫好,沒攔截到這筆異常交易,但已經成交了,想辦法把這異常交易做刪除,不給老闆發現,如何完成!

  4. 商品標準單價表與銷售紀錄表作合併 Join 後,得到下圖,只要出現 DifferencePrice 為負值(賣低於標準單價),就把它刪掉,不要給老闆知道!

    -- 商品銷售記錄檔 (包含計算價差)
    SELECT SalesRecord.*, 
        StandardPrice.StandardPrice,
        SalesRecord.SalePrice - StandardPrice.StandardPrice AS DifferencePrice
    FROM SalesRecord
    LEFT OUTER JOIN StandardPrice ON StandardPrice.ProductNo = SalesRecord.ProductNo
    ORDER BY SalesRecord.Id

  1. 只單純列出商品銷售單價低於標準單價記錄的SQL,總共只有三筆。

    -- 商品銷售單價低於標準單價記錄 
    SELECT * FROM SalesRecord WHERE SalePrice < (SELECT StandardPrice FROM StandardPrice WHERE ProductNo = SalesRecord.ProductNo)
    ORDER BY Id

    說明
    — 商品銷售單價低於標準單價記錄
    取出銷售紀錄所有資料,當單價(SalePrice) < 標準單價(來自於另一 Table 設定)
    SELECT * FROM SalesRecord WHERE (SalePrice) < 標準單價(來自於另一 Table 設定)
    SELECT * FROM SalesRecord WHERE (SalePrice) < 標準單價(子查詢)

    — 子查詢內容
    從標準單價設定檔(StandardPrice) 取出標準單價(StandardPrice),條件是要跟我的商品編號相同 (WHERE ProductNo = SalesRecord.ProductNo)
    SELECT * FROM SalesRecord WHERE (SalePrice) < (SELECT StandardPrice FROM StandardPrice WHERE ProductNo = SalesRecord.ProductNo)

    — 刪除商品銷售單價低於標準單價記錄
    DELETE FROM SalesRecord WHERE SalePrice < (SELECT StandardPrice FROM StandardPrice WHERE ProductNo = SalesRecord.ProductNo)

同 商品銷售單價低於標準單價記錄,要刪除的是銷售單價(SalePrice) 低於,從標準記錄檔(StandardPrice)中抓出的標準單價(StandardPrice) 條件兩個資料表商品編號要相同(WHERE ProductNo = SalesRecord.ProductNo)

刪除後,Id=1、Id=6、Id=14 都會被刪除。

執行後

也可以查詢銷售紀錄檔,使用指令: SELECT * FROM SalesRecord,可看到資料Id=1、Id=6、Id=14都不見了。

刪除全部資料

刪除資料分兩種指令:

  • Truncate: 不可以指定條件,全部內容
  • DELETE: 可以指定條件,部分內容
SELECT * FROM SalesRecord ORDER BY SaleDate , ProductNo
--
DELETE FROM SalesRecord
TRUNCATE TABLE SaleRecord
--
SELECT * FROM SalesRecord ORDER BY SaleDate , ProductNo