Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 353
Посетитель,

потому что такое поведение нелогично с точки зрения логики и с точки зрения реляционной теории, и не очевидно. Знать наизусть всю документацию нереально. А конструкция не выдает ошибки.
Как с теми же переменными, которые ругаются, когда пытаешься присвоить им несколько значений. По той же логике, по сути мы обновляем запись в целевой таблице некой "переменной", которая приняла в операции UPDATE значение, прочитанное из другой таблицы.
Сугубо имхо))).
15 май 19, 16:10    [21885488]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
iap
Member

Откуда: Москва
Сообщений: 46812
Ёжик25
Посетитель,

потому что такое поведение нелогично с точки зрения логики и с точки зрения реляционной теории, и не очевидно. Знать наизусть всю документацию нереально. А конструкция не выдает ошибки.
Как с теми же переменными, которые ругаются, когда пытаешься присвоить им несколько значений. По той же логике, по сути мы обновляем запись в целевой таблице некой "переменной", которая приняла в операции UPDATE значение, прочитанное из другой таблицы.
Сугубо имхо))).
Если написать SELECT @V=V FROM T, то SELECT может вернуть хоть миллиард записей, - присвоится последнее (я, кажется, это уже говорил).
А вот если SET @V=(SELECT V FROM T)то SELECT в скобках обязан вернуть не более одного значения,
ибо это скалярное выражение. Иначе обругается.
15 май 19, 16:16    [21885502]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 353
iap
Ёжик25
Посетитель,

потому что такое поведение нелогично с точки зрения логики и с точки зрения реляционной теории, и не очевидно. Знать наизусть всю документацию нереально. А конструкция не выдает ошибки.
Как с теми же переменными, которые ругаются, когда пытаешься присвоить им несколько значений. По той же логике, по сути мы обновляем запись в целевой таблице некой "переменной", которая приняла в операции UPDATE значение, прочитанное из другой таблицы.
Сугубо имхо))).
Если написать SELECT @V=V FROM T, то SELECT может вернуть хоть миллиард записей, - присвоится последнее (я, кажется, это уже говорил).
А вот если SET @V=(SELECT V FROM T)то SELECT в скобках обязан вернуть не более одного значения,
ибо это скалярное выражение. Иначе обругается.


Забавно, а вот PG присваивает первое значение при SELECT @V=V FROM T.
15 май 19, 16:44    [21885549]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
step_ks
Member

Откуда:
Сообщений: 936
Ёжик25, может еще и так быть
if object_id('tempdb..#src') is not null Drop table #src;
if object_id('tempdb..#trg') is not null drop table #trg;
GO

create table #src (id int, type int, value1 nvarchar(20),value2 nvarchar(20))
insert into #src (id,type,value1,value2)  values (10,8,'888',null), (10,8,'777','ccc'), (10,8,'999',null), (111,8,'999',null)

create table #trg (id int, type int, value1 nvarchar(20),value2 nvarchar(20))
insert into #trg (id,type,value1) values (10,8,'111')


select * from #src
select * from #trg

update #trg set
        value1 = #src.value1,
        value2 = #src.value2
    from #trg join #src on #trg.id = #src.id and #trg.type=#src.type;

select * from #trg
GO


Результаты:

-- select * from #src
id type value1 value2
----------- ----------- -------------------- --------------------
10 8 888 NULL
10 8 777 ccc
10 8 999 NULL
111 8 999 NULL

-- select * from #trg
id type value1 value2
----------- ----------- -------------------- --------------------
10 8 111 NULL


-- select * from #trg после update
id type value1 value2
----------- ----------- -------------------- --------------------
10 8 888 ccc
16 май 19, 08:54    [21885869]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28880
Ёжик25
потому что такое поведение нелогично с точки зрения логики и с точки зрения реляционной теории, и не очевидно. Знать наизусть всю документацию нереально. А конструкция не выдает ошибки.
Да, наверное, с точки зрения чистой теории это неправильно.
Но так было сделано во всех без исключения реализациях SQL, наверное, потому, что UPDATE с джойнами часто даёт повторяющиеся значения, и генерить ошибку было бы непрактично. Поэтому сделали обновление случайной записью.

То есть это теоретически неправильно, но вполне логично.

Тем более, не забывайте, когда это было сделано - в 70-е, 80-е. Вспомните, что такое SQL, и зачем он появился.
Тогда же, например, придумали понятие "владелец объекта", что бы 2 бухгалтера, набирая запросы в SQL для составления ведомости на зарплату, или сведения квартального баланса, не мешали друг другу.

А MERGE, или скалярный подзапрос, или присвоегие переменной в SET, придумали намного позже, это более сложные конструкции, они расчитаны на программистов, а не бухгалтеров, и они более строгие.
16 май 19, 09:07    [21885881]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить