2012-08-03 33 views
0

我有一种感觉,我在这个问题上花费了太多时间,并且已经失明了...并且希望有一双清新的眼睛可以帮助指出一个简单的错误!我可以将这两个几乎相同的MERGE语句合并为一个吗?

这是MERGE声明我认为应该工作:

不工作:

MERGE assignment_tbl AS target 
USING (SELECT 1 s) AS source 
ON target.id = @id 
    AND target.id1 = @id1 
    AND target.id2 = @id2 
WHEN matched AND NOT (target.iFeeScope = @iFeeScope OR target.nFeeAmount = @nFeeAmount) AND (target.bActive = 1) THEN 
    UPDATE SET target.dLastUpdated = @dNow, 
      target.dDisabled = @dNow, 
      target.bActive = 0; 

的问题是在我WHEN matched AND NOT声明:(target.iFeeScope = @iFeeScope OR target.nFeeAmount = @nFeeAmount),并围绕这个我”的唯一途径我们发现将这个陈述分成两个单独的(并且几乎相同的)块:

工作(但效率不高):

MERGE assignment_tbl AS target 
USING (SELECT 1 s) AS source 
ON target.id = @id 
    AND target.id1 = @id1 
    AND target.id2 = @id2 
WHEN matched AND NOT (target.iFeeScope = @iFeeScope) AND (target.bActive = 1) THEN 
    UPDATE SET target.dLastUpdated = @dNow, 
      target.dDisabled = @dNow, 
      target.bActive = 0; 

MERGE assignment_tbl AS target 
USING (SELECT 1 s) AS source 
ON target.id = @id 
    AND target.id1 = @id1 
    AND target.id2 = @id2 
WHEN matched AND NOT (target.nFeeAmount = @nFeeAmount) AND (target.bActive = 1) THEN 
    UPDATE SET target.dLastUpdated = @dNow, 
      target.dDisabled = @dNow, 
      target.bActive = 0; 

我需要什么,我原来的语句来更改实现以下两个语句的结果?

谢谢大家提前!

回答

0

解决它在我自己的......想通这是与AND/NOT逻辑的问题!

MERGE assignment_tbl AS target 
USING (SELECT 1 s) AS source 
ON target.id = @id 
    AND target.id1 = @id1 
    AND target.id2 = @id2 
    AND target.bActive = 1 
WHEN matched AND (NOT (target.iFeeScope = @iFeeScope)) 
      OR (NOT (target.nFeeAmount = @nFeeAmount)) THEN 
    UPDATE SET target.dLastUpdated = @dNow, 
      target.dDisabled = @dNow, 
      target.bActive = 0; 
0

什么:

WHEN matched AND target.iFeeScope != @iFeeScope AND target.nFeeAmount != @nFeeAmount AND (target.bActive = 1) THEN 
+0

这与我原来的代码一样,但谢谢。我已经回答了解决方案。 – Paul 2012-08-03 01:57:21

相关问题