2013-11-25 2 views
1

Правильно ли это SQL:SQL запросов: Обновление от

UPDATE T1alias 
SET T1alias.Row2 = T2alias.Row2 
FROM 
(
    T1 AS T1alias 
    INNER JOIN 
    T2 AS T2alias 
    ON T1alias.Row1 = T2alias.Row1 
) 

Этот запрос, кажется, возвращает правильные результаты, но я не понимаю, почему. Я имею в виду, что предложение FROM относится к полному разному набору данных относительно таблицы T1, которая должна быть обновлена. F.e .:

T1         T2 
----------------------    ---------------------- 
| Row1 | Row2 | Row3 |    | Row1 | Row2 | Row3 | 
----------------------    ---------------------- 
| 1 | 2 | 3 |    | 1 | 7 | 8 | 
---------------------    ---------------------- 
| 4 | 5 | 6 |    | 9 | 10 | 11 | 
----------------------    ---------------------- 
T1 INNER JOIN T2 ON T1alias.Row1 = T2alias.Row1 
------------------------------------------------------------- 
| T1.Row1 | T1.Row2 | T1.Row3 | T2.Row1 | T2.Row2 | T2.Row3 | 
------------------------------------------------------------- 
| 1  | 2  | 3  | 1  | 7  | 8  | 
------------------------------------------------------------- 

Так как я могу UPDATE T1 из присоединяемой таблицы?

По-моему, это разные разные наборы данных. Я бы понял запрос SQL, если она будет выглядеть следующим образом:

UPDATE T1alias 
SET T1alias.Row2 = T2alias.Row2 
FROM 
(
    T1 AS T1alias 
    INNER JOIN 
    T2 AS T2alias 
    ON T1alias.Row1 = T2alias.Row1 
) AS T1T2JoinedAlias 
WHERE T1T2JoinedAlias.Row1 = T1alias.Row1 

Может кто-нибудь объяснить это мне, пожалуйста. (я работаю на Microsoft SQL Server 2008 R2)

+1

См. [Этот вопрос] (http://stackoverflow.com/questions/2334712/update-from-select-using-sql-server) – Fabian

+0

Ваш последний запрос неверен. Вы не можете иметь псевдоним для соединения таблицы в запросе обновления. – P5Coder

+0

@Fabian, если вы имеете в виду комментарий «Это работает, используя UPDATE, чтобы перебирать INNER JOIN. Таким образом, ON действует как предложение WHERE, а INNER JOIN пропускает записи, которые не найдены в таблице JOINed». Но я был бы рад, если бы кто-нибудь мог объяснить это более подробно. – user1911091

ответ

1

Если посмотреть на план выполнения вашего SQL заявления, вы поймете, что происходит:

Execution Plan of Update Query

Как вы можете видеть (в мой случай), оптимизатор запросов выполняет проверку обеих таблиц, указанных в предложении FROM, и извлекает строки, которые соответствуют внутреннему соединению.

Эти строки затем передаются по цепочке физическому оператору обновления таблицы, который, как видите, предлагается выполнить обновление на T1 (вы скажете ему сделать это, сказав «Update T1Alias» в вашем запросе выше , вы также указываете, какое поле (ы) обновляется командой SET)

Анализатор запросов имеет тенденцию выбирать наилучший план выполнения для вашего запроса после того, как алгебраир скомпилировал его в двоичный файл, так что получится ли такое же выполнение как мне или нет, будет зависеть от ряда факторов, включая наличие индексов на таблицах.

Надеюсь, это поможет.

Смежные вопросы