【问题标题】:Query to update multi column duplicates查询更新多列重复项
【发布时间】: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


【解决方案1】:

一种方法可能是 -

  • 使用您的第一个查询,该查询为“违规者”记录提供唯一条目,当您命名它们时,将它们放入临时表(或为临时目的创建的表)中。

    李>
  • 删除所有主表SB_BATCH中的违规记录

  • 然后再次从临时表重新插入到表 SB_BATCH 中。

注意 - 如果您的 ID 是唯一的并且是使用增量/自定义逻辑生成的,则删除和重新插入可能不会保留它们。

如果您的目标是删除/删除表中的重复项,则上述方法可行。但我相信我误解了你的问题。

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2021-03-31
    • 2018-11-08
    • 2013-02-09
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多