跳至內容
Astera Technology

筆數及總數都對,為甚麼資料仍然錯了?

沿固定編號逐筆比對,也查目標多出資料,不能只靠合計數字。

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

先準備用來排查的資料

搬遷後筆數及總數可能一樣,每筆數量卻放錯。沿識別資料逐筆比較,空值差異也要查,並加入目標多出紀錄的分支。本例明確採 SQLite IS NOT 的空值比較。

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

假設輸入:source_rows
編號數量
A3
B7
下載可編輯 CSV ↓
假設輸入:target_rows
編號數量
A4
B6
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE source_rows(id TEXT PRIMARY KEY,qty INTEGER);
CREATE TABLE target_rows(id TEXT PRIMARY KEY,qty INTEGER);
INSERT INTO source_rows VALUES ('A',3),('B',7);
INSERT INTO target_rows VALUES ('A',4),('B',6);

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

錯誤示範查詢:只用來重現問題
SELECT (SELECT COUNT(*) FROM source_rows)=(SELECT COUNT(*) FROM target_rows)
AND (SELECT SUM(qty) FROM source_rows)=(SELECT SUM(qty) FROM target_rows) AS agrees;
實際執行的錯誤示範結果
合計一致(1=是)
1
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT s.id,s.qty AS source_qty,t.qty AS target_qty FROM source_rows s LEFT JOIN target_rows t ON t.id=s.id
WHERE t.id IS NULL OR s.qty IS NOT t.qty
UNION ALL SELECT t.id,NULL,t.qty FROM target_rows t WHERE NOT EXISTS(SELECT 1 FROM source_rows s WHERE s.id=t.id) ORDER BY id;
更正查詢的實際結果
編號原數量目標數量
A34
B76
下載可編輯 CSV ↓

原 A/B 是三及七,目標卻是四及六;兩邊都是兩筆、十件,錯誤摘要判定一致。逐筆查便列出兩項。未確認原資料及更正授權前,不應自動覆寫目標。

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

在假設目標改回 A/B,再加零件數的 C,只剩 C 要跟進。多出的零數量紀錄仍有意義,即使總件數不變。

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

新假設副本內的邊界改動
UPDATE target_rows SET qty=3 WHERE id='A'; UPDATE target_rows SET qty=7 WHERE id='B'; INSERT INTO target_rows VALUES ('C',0);
改動後再執行更正查詢的實際結果
編號原數量目標數量
CNULL(未知或未能定義)0
下載可編輯 CSV ↓

兩邊編號唯一,只核對一個數量欄;轉換、重複身分及允許額外資料須另訂對照要求。

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

相關資源