【发布时间】:2015-09-10 08:33:18
【问题描述】:
我即将在我的数据库上应用 3 列(B_ACCT_UID、B_EXT_ID、B_CAMPAIGN_GUID)唯一约束。 B_EXT_ID 的“无”值不受影响。在这样做之前,我需要更新 B_EXT_ID 行以删除违规者(附加 row_id 或类似的东西)。
我知道如何找到它们:
SELECT B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID, COUNT(*)
FROM SB_BATCH
WHERE B_EXT_ID != 'none'
GROUP BY B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID
HAVING COUNT(B_EXT_ID) > 1;
哪个打印:
B_ACCT_UID B_EXT_ID B_CAMPAIGN_GUID COUNT(*)
---------- -------------------------------------------------------------------------------------------------------------------------------- ------------------------------------ ----------
3000000010 sto setna 2
3000000010 jeden pierwsza 2
3000000010 dziewiec 14F8CDEDACE0005C98727464800000000000 3
在尝试更新之前,我执行了将被更新替换的选择查询。
SELECT B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID
FROM SB_BATCH
WHERE B_EXT_ID IN (SELECT B_EXT_ID FROM SB_BATCH WHERE B_EXT_ID != 'none'
GROUP BY B_ACCT_UID, B_EXT_ID, B_CAMPAIGN_GUID
HAVING COUNT(B_EXT_ID) > 1);
得到:
B_ACCT_UID B_EXT_ID B_CAMPAIGN_GUID
---------- -------------------------------------------------------------------------------------------------------------------------------- ------------------------------------
3000000010 sto 14F8CDEDACE0005C98727464800000000000
3000000010 sto setna
3000000010 sto setna
3000000010 jeden pierwsza
3000000010 jeden pierwsza
3000000010 jeden 14F8CDEDACE0005C98727464800000000000
3000000010 dziewiec 14F8CDEDACE0005C98727464800000000000
3000000010 dziewiec 14F8CDEDACE0005C98727464800000000000
3000000010 dziewiec 14F8CDEDACE0005C98727464800000000000
这是一个半有效的例子,因为它也会更新像这样的非违规者
B_ACCT_UID B_EXT_ID B_CAMPAIGN_GUID
---------- -------------------------------------------------------------------------------------------------------------------------------- ------------------------------------
3000000010 sto 14F8CDEDACE0005C98727464800000000000
你能帮我修改查询吗?
【问题讨论】:
-
您使用的是哪个 DBMS?甲骨文、Mysql?
-
它是 Oracle,版本 11。
-
现在你想做什么?你想删除重复项吗?或更新其中一个重复行?如果是,您要更新哪一列?
-
我已经在问题中说明了这一点:“在这样做之前,我需要更新 B_EXT_ID 行以删除违规者(附加 row_id 或类似的东西)。”
标签: sql oracle11g duplicates constraints