2010-01-19 123 views
4

我怎样才能避免在下面的T-SQL语句复制的子查询:更新子查询中的多个列?

update r set 
    column1=(select top 1 max(column1) from region r2 where (overlapping test conditions)), 
    column2=(select top 1 max(column2) from region r2 where (overlapping test conditions)) 
from region r 

基本上,我有一个包含矩形区域的表。对于每个重叠区域,我需要将某些列设置为该重叠区域的聚合值。

感谢

编辑:我在这里增加一个过于简单化的重叠条件:

(r.left >= r2.left and r.left < r2.right) or (r.right <= r2.right and r.right > r.left) 

的一点是:r和R2将在子查询中被引用。看起来这是普通表格表达的完美情况,但我无法弄清楚如何在每条记录中使用它。

+0

*重叠测试条件*会是什么,并且它们是否相符欢欣鼓舞?你可以使用单个子查询吗? – 2010-01-19 18:20:38

+0

@astander:图像一堆r.left> r2.left和r.top> r2.top ...;你不想重复的东西。 – Codism 2010-01-19 18:28:40

+0

你可以添加这些问题中的子句。如果他们都一样,这将改变我们看问题的方式。 – 2010-01-19 18:41:34

回答

1
UPDATE Region 
SET 
    Region.Column1 = r.Column1 
    Region.Column2 = r.Column2 
FROM 
    Region 
INNER JOIN 
(
    SELECT 
     Column1, 
     Column2 
    FROM Region 
    WHERE (your condition here) 
) r ON r.ID = Region.ID 

我刚刚注意到MAX()aggs。对不起,没有看到第一次。 您将有可能有两个内部连接,使这项工作...

所以采取什么我也为了COLUMN1

INNER JOIN (SELECT MAX(Column1) FROM ... WHERE ...) r ON r.ID = Region.ID 

然后第二INNER JOIN

INNER JOIN (SELECT MAX(Column2) FROM ... WHERE ...)r2 ON r2.ID = Region.ID 

并且您的更新变为

UPDATE Region 
SET Region.Column1 = r1.Column1, 
    Region.Column2 = r2.Column2 
FROM Region 
INNER JOIN 
(SELECT MAX(Column1) as Column1 FROM ... WHERE ...) r ON r.ID = Region.ID 
INNER JOIN 
(SELECT MAX(Column2) As Column2 FROM ... WHERE ...) r2 ON r2.ID = Region.ID 
+0

@JonH:dup子查询是我试图避免的。此外,我更新了我的原始问题,以显示where子句的外观。似乎在这样的子查询中不能接受条件(多部分标识符“r.left”不能被绑定)。 – Codism 2010-01-19 19:02:59

+0

好吧,你没有在开始时提到抱歉。 让我再看一下,所以你想避免让两个SELECT更新两个不同的字段是正确的? – JonH 2010-01-19 19:08:29

+0

是的,有什么想法? – Codism 2010-01-19 19:10:59