2014-02-05 22 views
1

所以我看起來的表中調用虛像如何在SQL表與該列從另一個特定行的同一表中的值更新每一行的一列

A | B | C | D | E 
------------------ 
1 | 2 | 3 | 4 | u1 
1 | 2 | 4 | 3 | u2 
1 | 2 | 4 | 3 | u3 

我已經決定每行需要有相同的CWHERE E = u1。因此,我將結束:

A | B | C | D | E 
------------------ 
1 | 2 | 3 | 4 | u1 
1 | 2 | 3 | 3 | u2 
1 | 2 | 3 | 3 | u3 

要做到這一點,我跑下面的查詢:

update tb1 
set tb1.C = tb2.C 
from dummy as tb1, dummy as tb2 
where tb2.E = 'u1' 

我只是好奇,如果這是做在SQL Server這樣的事情的最好方法。

+0

你可以使用的JOIN,但是這一個簡單的查詢它並不需要優化。 – Mihai

+1

我們希望引擎足夠聰明,在執行連接之前限制tb2的結果,這可能會導致大的笛卡爾積。如果不是,那麼進行內連接並將E的限制放在連接上可能會更有效。但測試將不得不做的知道。這實際上取決於數據庫版本補丁,以便引擎如何處理這個問題。很好的問題,但。我想過一個子選擇,但是爲每一行做這件事可能會導致性能下降。再次,只有知道的方法是測試。嘗試所有3種方法並查看執行計劃! – xQbert

+0

另一個項目要知道,如果C對於E的相同值具有不同的值,那麼您的查詢將不起作用。因爲tb2會返回多個值。到目前爲止發佈的三個答案都爲您提供了C的價值,這可能不是您想要的。如果你知道你只有1的價值E是U1那麼它是一個非問題。然而,如果你有多個你的解決方案會失敗,並且發佈的三個答案要麼提供C的最大值,要麼C的隨機值爲。 – xQbert

回答

0

試試這個

update dummy set C = (SELECT TOP 1 C FROM dummy WHERE E = 'u1') 
+0

opss沒有看到你的帖子,直到我發佈了我的:S –

0

測試數據

DECLARE @TABLE TABLE (A INT,B INT,C INT,D INT,E VARCHAR(2)) 
INSERT INTO @TABLE VALUES 
(1,2,3,4,'u1'),(1,2,4,3,'u2'),(1,2,4,3,'u3') 

更新查詢

UPDATE @TABLE 
SET C = (SELECT TOP 1 C 
     FROM @TABLE 
     WHERE E = 'u1') 

結果集

SELECT * FROM @TABLE 

╔═══╦═══╦═══╦═══╦════╗ 
║ A ║ B ║ C ║ D ║ E ║ 
╠═══╬═══╬═══╬═══╬════╣ 
║ 1 ║ 2 ║ 3 ║ 4 ║ u1 ║ 
║ 1 ║ 2 ║ 3 ║ 3 ║ u2 ║ 
║ 1 ║ 2 ║ 3 ║ 3 ║ u3 ║ 
╚═══╩═══╩═══╩═══╩════╝ 
0
;WITH x as 
(
    SELECT e,c, MAX(CASE WHEN E = 'u1' THEN c END) OVER() newc 
    FROM tb1 
) 
UPDATE x 
SET c = newc 
WHERE e <> 'u1' 
相關問題