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

Откуда:
Сообщений: 55
Разбираюсь сейчас в проблемном скрипте другого пользователя. Суть проблемы в том, что по логам происходит смена статуса у строк где этого не должно быть. Сейчас пришел к выводу что проблема в примере script 1, а именно во FROM используется подзапрос и SQL считает что таблицы table_A указанная у UPDATE и алиас А во FROM не одно и тоже, и апдейтит все строки таблицы table_A. Подтвердите пожалуйста мою догадку.
И второй вопрос, почему в варианте script 2 отрабатывает все нормально, хотя по сути во FROM также используется алиас таблицы, а в UPDATE указана таблица без алиаса

--script 1
update table_A
set
    status=6
--select *                
from 
    (select * from table_A where column_1 = 3) as A 
    left join table_B as B on A.ext_id=convert(varchar(32),B.id)
where
    B.id is null
    and A.status not in (9)


--script 2
update table_A
set
    status=6
--select *                
from 
    table_A as A
    left join table_B as B on A.ext_id=convert(varchar(32),B.id)
                                        and A.column_1 = 3
where
    B.id is null
    and A.status not in (6)
16 май 16, 16:37    [19179774]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по UPDATE  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
select в обоих случаях выдает кол-во строк=1, но UPDATE в первом случае делается по 8000 строк, во второе - 1.
16 май 16, 16:40    [19179790]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по UPDATE  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21194
Androgen1985
SQL считает что таблицы table_A указанная у UPDATE и алиас А во FROM не одно и тоже, и апдейтит все строки таблицы table_A.
Дык так оно и есть...
А за каким тут вообще подзапрос?
16 май 16, 16:41    [19179797]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по UPDATE  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
хз. сотрудник написал таким образом. Я просто не пойму в чем принципиальная разница между двумя скриптами? Можете объяснить, разжевать?
16 май 16, 16:42    [19179803]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по UPDATE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Androgen1985
хз. сотрудник написал таким образом. Я просто не пойму в чем принципиальная разница между двумя скриптами? Можете объяснить, разжевать?

(select * from table_A where column_1 = 3) as A не равно table_A :)
16 май 16, 16:45    [19179821]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по UPDATE  [new]
Androgen1985
Member

Откуда:
Сообщений: 55
Ну хорошо, (select * from table_A where column_1 = 3) as A не равно table_A, но ведь и UPDATE table_a тоже не равно FROM table_a as A
16 май 16, 16:48    [19179830]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по UPDATE  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21194
В секции UPDATE используется имя либо алиас таблицы из секции FROM.
В скрипте 2 алиас присвоен таблице, следовательно, он эквивалентен таблице. В скрипте 1 - нет.
Я бы вообще написал
update table_A
set status=6
from     table_A as A
left join table_B as B on A.ext_id=convert(varchar(32),B.id)
where
    B.id is null
    and A.status not in (6)
    and A.column_1 = 3
16 май 16, 16:49    [19179840]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по UPDATE  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
как говорит мсдн

автор
Если обновляемый объект совпадает с объектом в предложении FROM, а в предложении FROM имеется только одна ссылка на этот объект, псевдоним объекта указывать не обязательно. Если обновляемый объект встречается в предложении FROM несколько раз, одна и только одна ссылка на этот объект не должна указывать псевдоним таблицы. Все остальные ссылки на объект в предложении FROM должны включать псевдоним объекта.



а так вообще что бы не мучатьса лучше писать

update A
set status=6
from     table_A as A
left join table_B as B on A.ext_id=convert(varchar(32),B.id)
where
    B.id is null
    and A.status not in (6)
    and A.column_1 = 3
16 май 16, 16:53    [19179857]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить