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

Откуда: оттуда
Сообщений: 337
Drop table #src;
drop table #trg

create table #src (id int, type int, value nvarchar(20))
insert into #src values (10,8,'888'), (10,8,'777'), (10,8,'999'), (111,8,'999')
create table #trg (id int, type int, value nvarchar(20))
insert into #trg values (10,8,'111')


select #src.value from #trg join #src on #trg.id = #src.id and #trg.type=#src.type --возвращает 3 строки (как и в таблице источнике) со значениями '888','777','999' по полю value


update #trg set #trg.value = #src.value
from #trg join #src on #trg.id = #src.id and #trg.type=#src.type --обновление в таблице #trg произошло только по "первому" значению '888' 


Почему такая конструкция работает и не вызывает ошибки? Ведь по условию возвращается 3 значения. Но SQL выбирает "первое". Слово "первое" в кавычках, потому что, как я понимаю, для реляционной таблицы понятия первой записи не имеет смысла.
Dопрос в том, по какому принципу происходит выборка одного значения, по которому происходит обновление поля value в таблице #trg. Как мне в коде выше узнать, на какое значение обновляется #trg.value.
15 май 19, 14:56    [21885374]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
Ёжик25,

с чего вы решили что обновляет "первое"? оставляет "последнее"
15 май 19, 15:01    [21885381]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
iap
Member

Откуда: Москва
Сообщений: 46688
TaPaK
оставляет "последнее"
И это описано в документации Microsoft
15 май 19, 15:11    [21885392]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
msLex
Member

Откуда:
Сообщений: 6008
TaPaK
оставляет "последнее"


А есть какой-то пруф?
Просто, как я помню, не "первое" или "последнее" а просто "одно из".
15 май 19, 15:12    [21885394]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 337
iap,

что то ничего не нашел, прошу, дайте ссыль, весь интернет уже облазил на эту тему.
15 май 19, 15:18    [21885400]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 337
TaPaK,

выполните приведенный скрипт и посмотрите результат)
15 май 19, 15:18    [21885403]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
msLex
TaPaK
оставляет "последнее"


А есть какой-то пруф?
Просто, как я помню, не "первое" или "последнее" а просто "одно из".


оно так и будет, предварительно результат не определён, вопрос как будет отсортировано/пересортировано в плане

автор
Use caution when specifying the FROM clause to provide the criteria for the update operation. The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic. F


автор
выполните приведенный скрипт и посмотрите результат)

нет спасибо
15 май 19, 15:20    [21885406]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
msLex
Member

Откуда:
Сообщений: 6008
TaPaK
msLex
пропущено...


А есть какой-то пруф?
Просто, как я помню, не "первое" или "последнее" а просто "одно из".


оно так и будет, предварительно результат не определён, вопрос как будет отсортировано/пересортировано в плане

автор
Use caution when specifying the FROM clause to provide the criteria for the update operation. The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic. F


Это я и сам видел, я хотел увидеть какой-то пруф на "последний" с учетом "сортировки" в плане.
15 май 19, 15:23    [21885408]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
msLex
TaPaK
пропущено...


оно так и будет, предварительно результат не определён, вопрос как будет отсортировано/пересортировано в плане

пропущено...


Это я и сам видел, я хотел увидеть какой-то пруф на "последний" с учетом "сортировки" в плане.


автор
Compute summary values for groups of rows in a suitably sorted stream.

расшифровуйте
15 май 19, 15:24    [21885410]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
msLex
Member

Откуда:
Сообщений: 6008
TaPaK
автор
Compute summary values for groups of rows in a suitably sorted stream.

расшифровуйте

хмм, это откуда?

В справке по update такого нет, поиск в гуле находит только про stream aggregate.
15 май 19, 15:31    [21885422]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 337
msLex
TaPaK
пропущено...


оно так и будет, предварительно результат не определён, вопрос как будет отсортировано/пересортировано в плане

пропущено...


Это я и сам видел, я хотел увидеть какой-то пруф на "последний" с учетом "сортировки" в плане.


как я понял, из за такой "недетерминированности" мы не можем абсолютно точно сказать, каким значением из нескольких будет обновлена запись, и следует в таком случае вводить дополнительную логику, row_count какой нибудь, или времянку с отсортированными значениями из таблицы-источника?
15 май 19, 15:31    [21885423]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
msLex
TaPaK
пропущено...

расшифровуйте

хмм, это откуда?

В справке по update такого нет, поиск в гуле находит только про stream aggregate.

это тот оператор которое "это" делает. На самом деле вопрос бессмысленный, правильней ответ "не определён" заранее
15 май 19, 15:32    [21885426]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
msLex
Member

Откуда:
Сообщений: 6008
Ёжик25
msLex
пропущено...


Это я и сам видел, я хотел увидеть какой-то пруф на "последний" с учетом "сортировки" в плане.


как я понял, из за такой "недетерминированности" мы не можем абсолютно точно сказать, каким значением из нескольких будет обновлена запись, и следует в таком случае вводить дополнительную логику, row_count какой нибудь, или времянку с отсортированными значениями из таблицы-источника?


из-за такой недетерменированности, лучше вообще избегать подобных апдейтов.
15 май 19, 15:32    [21885427]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
Ёжик25
msLex
пропущено...


Это я и сам видел, я хотел увидеть какой-то пруф на "последний" с учетом "сортировки" в плане.


как я понял, из за такой "недетерминированности" мы не можем абсолютно точно сказать, каким значением из нескольких будет обновлена запись, и следует в таком случае вводить дополнительную логику, row_count какой нибудь, или времянку с отсортированными значениями из таблицы-источника?

пусть sql угадывает какое же значение ты хотел получить
15 май 19, 15:33    [21885429]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 337
msLex
Ёжик25
пропущено...


как я понял, из за такой "недетерминированности" мы не можем абсолютно точно сказать, каким значением из нескольких будет обновлена запись, и следует в таком случае вводить дополнительную логику, row_count какой нибудь, или времянку с отсортированными значениями из таблицы-источника?


из-за такой недетерменированности, лучше вообще избегать подобных апдейтов.





Вообще все началось с того, что я пытаюсь из SQL в Postgresql засунуть логику MERGE, которая, кстати, ругается на несколько результирующих значений и не работает.

Пока только через вот такую конструкцию получилось:
WITH cte (
update target from source ...returning ...)insert ...select ...from source left join cte on ...where cte ... is null

ну и вот столкнулся с такой "недетерминированностью" операции UPDATE.

Что ж, придется вводить таки дополнительную логику.

Всех благодарю. Вопрос закрыт.
15 май 19, 15:39    [21885435]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
msLex
Member

Откуда:
Сообщений: 6008
TaPaK
это тот оператор которое "это" делает.

"это" вполне может делать и hash aggregate
15 май 19, 15:41    [21885438]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18827
Ёжик25
Но SQL выбирает "первое".

MS как-то не любит распространяться о внутренней кухне, предпочитая просто рассказать про недетерминированность.
В доке к MySQL, например, чётко написано - любая запись обновляется только один раз за запрос. Отсюда и "первой записью" - остальные попытки обновления этой же записи игнорятся, ибо "уже было". А уж какая реально будет "первая" - это фиг знает, бо сортировки в подзапросах (без TOP N) тупо игнорятся (а местами так и вовсе запрещены, вроде).
15 май 19, 15:43    [21885444]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
msLex
TaPaK
это тот оператор которое "это" делает.

"это" вполне может делать и hash aggregate

а делает stream aпgregate... или вы предлагаете на этапе join выбрасывать всё?
15 май 19, 15:43    [21885445]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
iap
Member

Откуда: Москва
Сообщений: 46688
Ёжик25
iap,

что то ничего не нашел, прошу, дайте ссыль, весь интернет уже облазил на эту тему.
У меня была неточность: последнее значение присваивается переменной в SELECTе, если он возвращает несколько значений.

SELECT @Var=FieldValue FROM TableName


С UPDATE это не связано.

Про UPDATE написано следующее:

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/update-transact-sql?view=sql-server-2017
Проявляйте осторожность, указывая предложение FROM при задании критериев для операции обновления. Результаты инструкции UPDATE не определены, если инструкция включает предложение FROM, в котором для каждого вхождения обновляемого столбца не задано единственное значение, то есть если инструкция UPDATE не является детерминированной. Например, в инструкции UPDATE следующего скрипта обе строки в Table1 удовлетворяют условиям предложения FROM в инструкции UPDATE, но не определено, какая строка из Table1 используется для обновления строки в Table2

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1   
    (ColA int NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
CREATE TABLE dbo.Table2   
    (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);  
INSERT INTO dbo.Table2 VALUES(1, 0.0);  
GO  
UPDATE dbo.Table2   
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB  
FROM dbo.Table2   
    INNER JOIN dbo.Table1   
    ON (dbo.Table2.ColA = dbo.Table1.ColA);  
GO  
SELECT ColA, ColB   
FROM dbo.Table2;
15 май 19, 15:47    [21885449]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
msLex
Member

Откуда:
Сообщений: 6008
TaPaK
msLex
пропущено...

"это" вполне может делать и hash aggregate

а делает stream aпgregate... или вы предлагаете на этапе join выбрасывать всё?

Еще раз, "это" не обязательно делает stream aggregate, "это" может делаться и SQL сервером и через Hash aggregate с aggrtype any
15 май 19, 15:50    [21885453]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Ёжик25
Member

Откуда: оттуда
Сообщений: 337
iap,

вообще, конечно, я был очень удивлен такому поведению. Следовало бы, на мой взгляд, возвращать ошибку обновления, как это делается при MERGE. Ну давайте с тем же успехом переменной присваивать "первое" значение из множественного набора результата SELECT. Чего уж там!))))
15 май 19, 15:53    [21885459]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
msLex
Member

Откуда:
Сообщений: 6008
Ёжик25
iap,

вообще, конечно, я был очень удивлен такому поведению. Следовало бы, на мой взгляд, возвращать ошибку обновления, как это делается при MERGE. Ну давайте с тем же успехом переменной присваивать "первое" значение из множественного набора результата SELECT. Чего уж там!))))


Поведение странное, но оно задокументировано, что автомат превращает его (поведение) в фичу.
15 май 19, 15:55    [21885462]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
Посетитель
Member

Откуда:
Сообщений: 1189
Ёжик25
iap,

вообще, конечно, я был очень удивлен такому поведению. Следовало бы, на мой взгляд, возвращать ошибку обновления, как это делается при MERGE. Ну давайте с тем же успехом переменной присваивать "первое" значение из множественного набора результата SELECT. Чего уж там!))))


напишите свой SQL Server и управляйте его поведением как пожелаете.
зачем удивляться тому, что поведение соответствует описанию в документации?
15 май 19, 15:57    [21885466]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
iap
Member

Откуда: Москва
Сообщений: 46688
Ёжик25
iap,

вообще, конечно, я был очень удивлен такому поведению. Следовало бы, на мой взгляд, возвращать ошибку обновления, как это делается при MERGE. Ну давайте с тем же успехом переменной присваивать "первое" значение из множественного набора результата SELECT. Чего уж там!))))
Полностью согласен.
Правда, UPDATE появился на 200 лет раньше

Таких моментов много. Например, во многих случаях необязательно строго придерживаться
заявленного стиля даты в функции CONVERT() - сервер сконвертирует даже приблизительно
похожую на дату строку. Разве не безобразие? Строгости к нам, балбесам, не хватает!
15 май 19, 16:08    [21885485]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE FROM обновляет по первому значению результата джойна  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6221
Ёжик25
iap,

вообще, конечно, я был очень удивлен такому поведению. Следовало бы, на мой взгляд, возвращать ошибку обновления, как это делается при MERGE. Ну давайте с тем же успехом переменной присваивать "первое" значение из множественного набора результата SELECT. Чего уж там!))))

вперёд в спортлото

https://feedback.azure.com/forums/908035-sql-server
15 май 19, 16:08    [21885487]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить