我有2張桌子。表 A 和表 B。
表 A 具有以下列:
ID、Account_Number、Party_Number、time。
表 B 與表 A 有一個外鍵。表 B 中的列是:
ID、time、Agreement。
我將在表 A 中一次接收大量資料,有時會在表 A 中插入重復項(新添加的記錄與表 B 沒有任何鏈接)。
我嘗試使用以下 2 個查詢洗掉重復項:
查詢 1:
delete from A
where rowid IN (
select rid
from (
select rowid rid,
row_number()
over (partition by account_number,party_number
order by rowid) rn
from A
)
where rn <> 1
);
查詢 2:
delete
from A a
where rowid>(
select min(rowid)
from A b
where b.account_number=a.account_number
and b.party_number=a.party_number
);
在這兩種情況下,我都收到以下錯誤:
錯誤報告 - ORA-02292:違反完整性約束 (B_FK) - 找到子記錄。
查看錯誤我可以理解它正在嘗試洗掉已經鏈接到表 B 的較早記錄。我需要對洗掉查詢進行哪些修改,以便它只洗掉新添加的重復記錄?
編輯:在插入時time存盤sysdate。列ID鏈接表 A 和表 B。
uj5u.com熱心網友回復:
新添加的記錄將不會與表 B 有任何鏈接。我需要對洗掉查詢進行哪些修改才能僅洗掉新添加的重復記錄?
一種選擇是包括 NOT EXISTS
DELETE FROM A a
WHERE ROWID > (SELECT MIN (ROWID)
FROM A b
WHERE b.account_number = a.account_number
AND b.party_number = a.party_number)
AND NOT EXISTS
(SELECT NULL
FROM table_b x
WHERE x.id = a.id --> or whichever columns join tables A and B;
); -- you never said it so I'm just guessing
uj5u.com熱心網友回復:
您可能在使用 pseudocolumn 時遇到問題rowid。我不確定它是否告訴我們插入行的正確順序。
相反,您可以嘗試以下操作:
delete A
where ID not in (
select ID
from B
) and ID not in (
select id
from (
select id,
row_number() over (partition by account_number, party_number order by id) rn
from a
) where rn<>1
);
第一個not in條件將表 B 中已有的行排除在洗掉之外(基于外鍵ID)。這應該消除錯誤。
第二個not in條件從洗掉中排除那些為每組account_number和party_number重復項首先插入的行。既然你說的ID是一個序列,那么這就是知道首先插入哪一行的方法。我們將它們排除在外,因為即使它們可能未鏈接到表 B,您也可能稍后將它們鏈接到表 B。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353220.html
