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);