跳至內容
Astera Technology

明明有設備未檢查,NOT IN 為甚麼查不到?

檢查紀錄中有一筆漏填設備編號,也不應令所有未檢查設備消失。

下載完整個案資料及參考答案 ↓

先準備用來排查的資料

要找的是沒有對應檢查的設備。NOT IN 遇到子查詢的空值,未配對結果可能變成未知,而不是符合。逐件查有沒有相同編號的檢查,才不會受另一筆漏填編號影響。

以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。

假設輸入:equipment
編號
E1
E2
下載可編輯 CSV ↓
假設輸入:inspections
編號設備編號
1E1
2NULL(未知或未能定義)
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE equipment(id TEXT PRIMARY KEY);
CREATE TABLE inspections(id INTEGER PRIMARY KEY,equipment_id TEXT);
INSERT INTO equipment VALUES ('E1'),('E2');
INSERT INTO inspections VALUES (1,'E1'),(2,NULL);

重現錯誤結果,再核對更正

錯誤示範查詢:只用來重現問題
SELECT id FROM equipment WHERE id NOT IN (SELECT equipment_id FROM inspections) ORDER BY id;
實際執行的錯誤示範結果
查詢結果
沒有回傳資料(空結果)
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT e.id FROM equipment e WHERE NOT EXISTS
(SELECT 1 FROM inspections i WHERE i.equipment_id=e.id) ORDER BY e.id;
更正查詢的實際結果
編號
E2
下載可編輯 CSV ↓

錯誤查詢沒有結果。E1 已檢查,E2 沒有配對,所以更正後列出 E2。漏填編號的檢查仍要覆核,不能隨便補一個設備編號令報表看似正常。

套用前先測邊界及資料範圍

只在新的假設副本刪除空值行,更正後仍是 E2,證明另一筆錯誤資料不應左右這件設備是否要跟進。

邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。

新假設副本內的邊界改動
DELETE FROM inspections WHERE equipment_id IS NULL;
改動後再執行更正查詢的實際結果
編號
E2
下載可編輯 CSV ↓

此例只查有沒有紀錄,未看日期或結果;定期或合規檢查須另訂週期及通過條件。

以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。

相關資源