2013-11-03 52 views
0

有重复的记录我想更新一个表,但我的问题是目标表有重复的记录,所以我的更新失败的原因。这是错误:尝试使用来自多个连接行的值更新目标行。我知道在更新表格时,我们必须加入唯一的密钥,但我无法从表格中删除重复项目,所以我正在寻找解决方案。 CUSTOMERTABLE是有重复的人。这里是我的查询:更新表使用sql

UPDATE CUSTOMERTABLE 
SET SERVICE = 'BILLING' 
FROM 
(SELECT distinct(CUSTOMER_ID)AS ACCT_ID 
     ,ED.CUSTOMER_NAME 
     , ED.CUSTOMER_ADDRESS 
    FROM CUSTOMER_RELATION ED, STG_CUSTOMER_REV TXN 
    WHERE ED.CUSTOMER_ID = TXN.CUS_ID 
)AS X 

WHERE X.ACCT_ID = CUSTOMERTABLE.ACCOUNT_NUMBER; 

回答

2

尝试与IN条款写它:

UPDATE CUSTOMERTABLE 
SET SERVICE = 'BILLING' 
WHERE CUSTOMERTABLE.ACCOUNT_NUMBER IN 
    (SELECT CUSTOMER_ID 
    FROM CUSTOMER_RELATION ED 
    JOIN STG_CUSTOMER_REV TXN ON ED.CUSTOMER_ID = TXN.CUS_ID) 
0

尝试在在客户

UPDATE CUSTOMERTABLE 
SET SERVICE = 'BILLING' 
FROM 
(SELECT distinct(CUSTOMER_ID)AS ACCT_ID 
     ,ED.CUSTOMER_NAME 
     , ED.CUSTOMER_ADDRESS 
    FROM CUSTOMER_RELATION ED, STG_CUSTOMER_REV TXN 
    WHERE ED.CUSTOMER_ID = TXN.CUS_ID 
    GROUP BY ED.CUSTOMER_ID 
)AS X 

WHERE X.ACCT_ID = CUSTOMERTABLE.ACCOUNT_NUMBER; 

你需要确保你选择返回非重复分组。尝试使用没有更新语句的select,并检查select是否包含要删除的重复项。

+0

感谢键,子查询运行良好,但问题是这样的:CUSTOMERTABLE.ACCOUNT_NUMBER,在客户表中的ACCOUNT_NUMBER有重复 – moe

+0

@moe,如果ACCOUNT_NUMBER有重复,则更新会将它们添加的所有unles在哪里可以区分它们。你有没有尝试acfrancis的答案? –

2

这里是另一种选择,相比于IN解决方案,如果CUSTOMER_RELATIONSTG_CUSTOMER_REV是大表这可能有更好的表现。

UPDATE C 
    SET SERVICE = 'BILLING' 
FROM CUSTOMERTABLE C 
WHERE EXISTS (SELECT 1 
       FROM CUSTOMER_RELATION ED, STG_CUSTOMER_REV TXN 
       WHERE ED.CUSTOMER_ID = TXN.CUS_ID AND CUSTOMER_ID = C.ACCOUNT_NUMBER); 
+1

这很有趣。你为什么说这有更好的表现? – acfrancis

+0

查看以下链接以了解关于此主题的讨论。 http://stackoverflow.com/questions/2065329/sql-server-in-vs-exists-performance – wdosanjos

+0

公平点,但不要忘记,如果查询优化器可以确定它们在逻辑上等同于基础在表格定义上。 – acfrancis