2012-01-11 60 views
1
UPDATE TABLE1 set TABLE1.col1 = TABLE2.col1 
FROM TABLE2 INNER JOIN TABLE3 ON COL2 = TABLE2.COL2 
WHERE TABLE1.COL3 = TABLE3.COL3 

如果JOIN每个条件返回多个行,上述查询是否可以工作?我无法对其进行更新,尽管可以单独使用JoinTable3Table2使用select语句和内部联接的更新

请帮助。我希望这些信息是足够的。

回答

1

不,你必须从Table2中只选择1行 - sql server会选择Table2中的任何合适的行。

+0

@onedaywhen是的,你恰到好处。我已经检查过它并更正了答案 – 2012-01-11 11:30:02

+0

@oneday的确如此! – 2012-01-11 11:31:09

+0

@onedaywhen所以教义和僧侣! 8-)更正。我测试堆和集群键加入 - 在clust它选择最后一个值,在堆 - 任意 – 2012-01-11 11:55:22

3

如果有多行,那么任意行将用于更新。不会有错误发生。 您可以强制要求连接返回一行changing the UPDATE to a MERGE

+0

+1谢谢你是我的错误指向的源码 – 2012-01-11 11:30:45

+1

OP在2005年。 – 2012-01-11 12:01:38

2

由于您在SQL Server 2005上,因此您无法使用MERGE

为了得到一个确定性的结果,你需要一个相关的子查询。

UPDATE TABLE1 
SET TABLE1.col1 = ISNULL((SELECT TOP (1) TABLE2.col1 
          FROM TABLE2 
            INNER JOIN TABLE3 
             ON TABLE3.COL2 = TABLE2.COL2 
          WHERE TABLE1.COL3 = TABLE3.COL3 
          ORDER BY TABLE2.col1), TABLE1.col1)