2010-01-19 121 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