join子句,match或null

时间:2015-01-28 22:19:07

标签: sql sql-server

所以我有一些我继承的过程,我正在努力清理。我在其中反复看到的一件事情如下:

Update Table_A
Set A.ColX = B.Colx
From Table_A A
 Join Table_B B on B.col1 =A.col1
    and B.col2 = A.col2

Update Table_A
Set A.ColX = B.Colx
From Table_A A
Join Table_B B on a.col1 =b.col1
     and B.col2 is null

现在,我尝试将这些组合起来,使用以下不同的最终行(不是同时进行)来进行单个查询!:

1) and (B.col2 = A.col2 or B.col2 is null)
2) and (isnull(B.col2,'') = COALESCE(a.col2, ''))

然而,似乎总是会做其中一个更新,而不是两者。我觉得我错过了一些相当明显的东西,有没有一种很好的方法来结合这两个查询?

感谢

2 个答案:

答案 0 :(得分:2)

此查询应该有效:

Update Table_A
Set A.ColX = B.Colx
From Table_A A
 Join Table_B B on B.col1 = A.col1
    and (B.col2 = A.col2 OR or B.col2 is null)

你说你试过了 - 但你可以先尝试SELECT看看结果是什么。这可能会说明为什么你没有得到你期望的结果。

答案 1 :(得分:1)

我希望以下查询在SQL Server中起作用:

Update A
    Set ColX = B.Colx
    From Table_A A Join
         Table_B B
         on a.col1 = b.col1 and
            (B.col2 = A.col2 or B.col2 is null);

注意:

  • 您应该在from之后使用update子句中定义的别名。我的理解是,如果您使用表名并且表中没有别名的from子句,则所有行都将更新。

虽然我非常确定SQL Server不支持集合中的表别名,但我似乎错误地认为是this simple SQL Fiddle shows。也许这在某些古老版本的SQL Server中是不允许的,而且这个限制只是困在我身上。