Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пошагово как это работает  [new]
sanekoffice
Member

Откуда:
Сообщений: 373
UPDATE
Sales_Import
SET
Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON
SI.LeadID = RAN.LeadID

Сджоинил я 2 таблицы. А причем тут та что я обновляю? Как она вообще понимает какую строчку надо обновить?
6 ноя 15, 14:49    [18378802]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
Glory
Member

Откуда:
Сообщений: 104751
sanekoffice
Как она вообще понимает какую строчку надо обновить?

Она использует то условие, что вы указали SI.LeadID = RAN.LeadID
6 ноя 15, 14:53    [18378827]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
sanekoffice
Member

Откуда:
Сообщений: 373
Glory
sanekoffice
Как она вообще понимает какую строчку надо обновить?

Она использует то условие, что вы указали SI.LeadID = RAN.LeadID


Получается что это просто такой синтаксис? Лично для меня это 3 таблицы (а не две). Две я сджоинил и каким-то боком обновляем третью.
6 ноя 15, 14:57    [18378850]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
sanekoffice
Лично для меня это 3 таблицы (а не две).

Таблиц - две. Но одна из них в двух экземплярах (один для отбора, второй для обновления).
6 ноя 15, 15:01    [18378897]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
Glory
Member

Откуда:
Сообщений: 104751
sanekoffice
Лично для меня это 3 таблицы (а не две). Две я сджоинил и каким-то боком обновляем третью.

Именно.
Потому, что перед обновлением чего-либо, нужно сначала получить что-то.
Т.е. сначала сджойнить, а потом обновлять.
6 ноя 15, 15:02    [18378902]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
sanekoffice
Member

Откуда:
Сообщений: 373
ОК. Спасибо
6 ноя 15, 15:04    [18378923]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
sanekoffice
Получается что это просто такой синтаксис? Лично для меня это 3 таблицы (а не две). Две я сджоинил и каким-то боком обновляем третью.
Что бы не было сомнений, и лучше читалось, писать лучше так:
UPDATE
 SI
SET
 SI.AccountNumber = RAN.AccountNumber
FROM
 Sales_Import SI
INNER JOIN
 RetrieveAccountNumber RAN
ON 
 SI.LeadID = RAN.LeadID

Но так как в секции FROM других экземпляров Sales_Import нет, то сервер понимает, что обновляемая таблица - и есть та, которая с алиасом SI
Если бы в секции FROM использовались 2 таблицы Sales_Import, вот тогда сервер бы сгенерил ошибку
Msg 8154, Level 16, State 1, Line 28
The table 'Sales_Import' is ambiguous.
И тогда использование алиаса было бы уже обязательно.
6 ноя 15, 17:23    [18380056]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
Sales_Import.AccountNumber
Guest
sanekoffice
Glory
пропущено...

Она использует то условие, что вы указали SI.LeadID = RAN.LeadID


Получается что это просто такой синтаксис? Лично для меня это 3 таблицы (а не две). Две я сджоинил и каким-то боком обновляем третью.

postgres воспринял бы как три и проапдейтил бы все подряд
тут угадывает что имелось ввиду
синтаксис в стартовом посте в целом не рекомендуется по причине той же загадочности и вероятности потерять условие обновления

после SET алиас у колонок уже не нужен - уж он то здесь абсолютно бессмысленный
6 ноя 15, 17:33    [18380123]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Sales_Import.AccountNumber
postgres воспринял бы как три и проапдейтил бы все подряд
тут угадывает что имелось ввиду
синтаксис в стартовом посте в целом не рекомендуется по причине той же загадочности и вероятности потерять условие обновления
Ну, сиквел допускает только однозначное распознавание, никаких "вероятностей потерять" нет.

Другое дело, что писать так неправильно, зачем заставлять человека гадать и разбираться? С алиасом всегда понятнее.
6 ноя 15, 17:41    [18380172]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
Sales_Import.AccountNumber
Guest
alexeyvg
никаких "вероятностей потерять" нет.

а у меня был join на @t1 и условия, а потом я его взял и по криворукости и слепоглазости потерял
а все работает. и апдейтится тоже все.
GO
declare @t1 table (a int)

declare @t2 table (a int)


insert @t1 (a)
values (1), (2), (3)

insert @t2 (a)
values (10), (20), (30)


update @t1 set
  a *= 100
from @t2 t
where t.a <= 10

select * from @t1
select * from @t2
GO
6 ноя 15, 17:57    [18380259]     Ответить | Цитировать Сообщить модератору
 Re: Пошагово как это работает  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Sales_Import.AccountNumber
а у меня был join на @t1 и условия, а потом я его взял и по криворукости и слепоглазости потерял
а все работает. и апдейтится тоже все.
А, вы про это...
Да, это можно потерять.
Я имел в виду, что нельзя 2 экземпляра таблицы случайно завести, или получить случайный выбор обновляемой таблицы из 2х участвующих.
6 ноя 15, 18:38    [18380445]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить