簡體   English   中英

刪除Oracle中關聯查詢的記錄

[英]Delete records with correlation query in Oracle

我有一張包含用戶和地址的表格。
我需要從多個不同用戶與同一地址關聯的表中刪除所有記錄。
因此,我准備了以下查詢:

DELETE FROM MYTABLE A 
WHERE EXISTS (
    SELECT USER_ID 
    FROM MYTABLE B 
    WHERE A.ADDRESS = B.ADDRESS AND B.USER_ID > A.USER_ID
)

我發現有時這個查詢掛起,而大多數時候它工作正常。 我懷疑這種掛起可能是由鎖引起的。

有人可以確認是否是這種情況嗎? 一般來說,這是實現 Oracle 中目標的有效方法嗎?

oracle 版本為 12.1。

謝謝,

這是一個有點長的評論。

1) 如果不提供額外數據,就不可能知道是什么導致了您所看到的速度緩慢。

2)但是,在刪除重復項時,通常在 Oracle 中具有良好性能的解決方案是使用帶ANY的相關子查詢。 我會提倡以下查詢:

DELETE FROM MYTABLE A
WHERE A.USER_ID > ANY (SELECT USER_ID FROM MYTABLE B WHERE A.ADDRESS = B.ADDRESS)

對於此查詢(以及您的查詢),請考慮(USER_ID, ADDRESS )上的索引。

如果要刪除所有重復的行,我可能會建議:

DELETE FROM MYTABLE A 
WHERE A.ADDRESS IN (SELECT A2.ADDRESS
                    FROM MYTABLE A2
                    GROUP BY A2.ADDRESS
                    HAVING COUNT(DISTINCT A2.USER_ID) > 1
                   );

子查詢應該被評估一次。 (ADDRESS, USER_ID)上的索引將有助於查詢。

如果您想保留最小用戶 ID(這不是您所說的,但似乎很合理),那么我建議:

DELETE FROM MYTABLE A 
WHERE A.USER_ID > (SELECT MIN(A2.USER_ID)
                    FROM MYTABLE A2
                    WHERE A2.ADDRESS = A.ADDRESS
                   );

為此,相同的索引是有益的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM