1

假设我有两个表MainOther如下所示:

                    Main
+----------+-----------------------------------+
|  Field1  |  <set of other columns...>        |
+----------+-----------------------------------+
|   NULL   |           ...                     |
|   NULL   |           ...                     |
|   NULL   |           ...                     |


                          Other
           +-----------------------------------+
           |  <same set of other columns...>   |
           +-----------------------------------+
           |           ...                     |
           |           ...                     |
           |           ...                     |

是否有一种简洁的方法来更新Main.Field1其余列一起不在一行中的位置Other

换句话说,我想更新Field1每一行

SELECT <set of other columns...> FROM Main
   EXCEPT
SELECT <same set of other columns...> FROM Other

动态 SQL 是一种选择,但我试图找出最有效的方法来做这样的事情。

4

2 回答 2

1
update m
set ...
from Main m
where not exists(select * from Other where <columns-equal>)

这转化为左反半连接。

您也可以使用左连接,但这会转化为普通的左连接加过滤器,效率略低。这看起来像是优化器的弱点。

于 2012-06-15T15:41:07.917 回答
1

如果你真的想要,你可以使用 except 子句

UPDATE m
SET field = 'AValue'
FROM 
   MAIN  m
   INNER JOIN 
    (SELECT * FROM MAIN
    EXCEPT
    SELECT * FROM OTHER ) t
on m.PK = t.PK

演示

您应该注意, *此处的使用非常脆弱,您应该明确设置您的字段列表。它还假设连接字段 (PK) 在 Main 和 Other 中都可用,并且它们是相同的

否则,您最好使用 NOT EXISTS 或 ANTI-JOIN (LEFT/ISNULL)

UPDATE m
   SET Field1 = 'foo'
FROM 
   Main m
   LEFT JOIN 
     Other o
    ON m.FIELD2 = o.FIELD2
    AND m.FIELD3 = o.FIELD3
WHERE 
   o.PK is null

演示

于 2012-06-15T15:44:41.760 回答