2013-01-23 111 views
3

我正在写一个SQL(Oracle)来更新另一个表中的值的表。但是由于存在2列唯一约束,所以更新总是失败。它是这样的:SQL:如何在更新时确定并跳过唯一约束?

Table A 
- A_1 
- A_2 
- A_3 
(There is a unique constraint for A_1 + A_3) 

Table B 
- B_1 
- B_2 

这里是我当前的SQL:

UPDATE A a 
SET a.A_1 = 
    (SELECT b.B_1 
    FROM B b 
    WHERE a.A_2 = b.B_2 
    ) 
AND EXISTS 
    (SELECT b.B_1 
    FROM B b 
    WHERE a.a.A_2 = b.B_2 
    ) 

我想跳过违反唯一约束的行,但我不知道该怎么做。请指教。谢谢!

回答

0

可以放在最后一个AND NOT EXISTS,检查对新的约束值(如将更新后):

... 
AND NOT EXISTS 
(
    SELECT 1 
    FROM A checkA 
    WHERE checkA.A_1 = (SELECT b.B_1 FROM B b WHERE a.A_2 = b.B_2) 
    AND checkA.A_3 = a.A_3 
) 
+0

谢谢您的回答。我明白了。我正在尝试它。但是我看到一个运行时间太长的问题。 B桌非常大。你有什么想法来改进它吗?谢谢! – Xiezi

+0

原谅我的天真,但我会先看看你为什么要做更新,但随意忽略行,因为他们会失败的约束。在我的书中,一个约束失败的事实表明你在第一个地方做错了事情...... –

+0

你的观点对我来说也是有意义的。这实际上是一个从表格到另一个表格的数据回填。 B表是将数据转发到A表的中间件。现在我们将它合并到一张表中。由于我们为A未添加一些新功能,A和B之间可能存在冲突数据。这是导致我们新功能缺陷的原因。我们现在要去讨论它。 – Xiezi