Sql join子句,匹配还是空

Sql join子句,匹配还是空,sql,sql-server,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 n

所以我有一些我继承的程序,我正在努力清理。我在他们身上反复看到的一件事是:

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
现在,我尝试使用以下不同的最后一行(不是同时!)将它们组合成一个查询:

但是,它似乎总是执行其中一个更新,而不是两个更新。我觉得我遗漏了一些非常明显的东西,有没有一个好的方法来组合这两个查询


谢谢

此查询应该可以:

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)

你说你已经试过了,但是你可以先尝试一下
选择
,看看结果如何。这可能有助于解释为什么没有得到预期的结果。

我希望以下查询在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
    子句中定义的别名。我的理解是,如果您使用表名,并且表不在
    from
    子句中,并且没有别名,那么所有行都将被更新

虽然我非常确定SQL Server不支持集合中的表别名,但我似乎在这一点上错了。也许这在一些古老版本的SQL Server中是不允许的,我一直受到限制。

是不是
col1
col2
的组合是唯一的?我将它们作为选择运行,以查看它们是否会运行。我想可能还有另一个问题,因为我只是尝试了一个非常简单的问题,我得到了我预期的结果。我需要把它构建成复杂的表单,看看isI发现了什么问题,在很多查询中,上面的操作都很好。这只是其中一个有问题,只是碰巧是我一直在看的那个!发现了问题。我所看到的两个问题并不是相互排斥的。第二个查询将覆盖第一个查询中的一些记录!伟大的逻辑!你的第二颗子弹似乎不对。虽然在set语句中使用表别名可能不是最佳做法(仍在试图找到该语句的答案),但SQL Server是否支持它。@Limey。你似乎是对的,所以我已经确定了答案。我很确定这不管用。也许它在一些旧版本上不起作用,我再也没有尝试过。但看起来这可能是一个最佳实践。看看微软的一些例子,他们在set语句中没有使用别名。
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);