2014-02-05 4 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 Query

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' 
Смежные вопросы