Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE FROM обновляет по первому значению результата джойна / 25 сообщений из 30, страница 1 из 2
15.05.2019, 14:56
    #39813601
Ёжик25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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.
...
Рейтинг: 0 / 0
15.05.2019, 15:01
    #39813604
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25,

с чего вы решили что обновляет "первое"? оставляет "последнее"
...
Рейтинг: 0 / 0
15.05.2019, 15:11
    #39813608
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
TaPaKоставляет "последнее"И это описано в документации Microsoft
...
Рейтинг: 0 / 0
15.05.2019, 15:12
    #39813610
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
TaPaKоставляет "последнее"

А есть какой-то пруф?
Просто, как я помню, не "первое" или "последнее" а просто "одно из".
...
Рейтинг: 0 / 0
15.05.2019, 15:18
    #39813612
Ёжик25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
iap,

что то ничего не нашел, прошу, дайте ссыль, весь интернет уже облазил на эту тему.
...
Рейтинг: 0 / 0
15.05.2019, 15:18
    #39813613
Ёжик25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
TaPaK,

выполните приведенный скрипт и посмотрите результат)
...
Рейтинг: 0 / 0
15.05.2019, 15:20
    #39813614
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
msLexTaPaKоставляет "последнее"

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

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

автор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

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

нет спасибо
...
Рейтинг: 0 / 0
15.05.2019, 15:23
    #39813615
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
TaPaKmsLexпропущено...


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

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

автор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

Это я и сам видел, я хотел увидеть какой-то пруф на "последний" с учетом "сортировки" в плане.
...
Рейтинг: 0 / 0
15.05.2019, 15:24
    #39813617
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
msLexTaPaKпропущено...


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

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


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

авторCompute summary values for groups of rows in a suitably sorted stream.
расшифровуйте
...
Рейтинг: 0 / 0
15.05.2019, 15:31
    #39813622
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
TaPaKавторCompute summary values for groups of rows in a suitably sorted stream.
расшифровуйте
хмм, это откуда?

В справке по update такого нет, поиск в гуле находит только про stream aggregate.
...
Рейтинг: 0 / 0
15.05.2019, 15:31
    #39813623
Ёжик25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
msLexTaPaKпропущено...


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

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


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

как я понял, из за такой "недетерминированности" мы не можем абсолютно точно сказать, каким значением из нескольких будет обновлена запись, и следует в таком случае вводить дополнительную логику, row_count какой нибудь, или времянку с отсортированными значениями из таблицы-источника?
...
Рейтинг: 0 / 0
15.05.2019, 15:32
    #39813624
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
msLexTaPaKпропущено...

расшифровуйте
хмм, это откуда?

В справке по update такого нет, поиск в гуле находит только про stream aggregate.
это тот оператор которое "это" делает. На самом деле вопрос бессмысленный, правильней ответ "не определён" заранее
...
Рейтинг: 0 / 0
15.05.2019, 15:32
    #39813625
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25msLexпропущено...


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

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

из-за такой недетерменированности, лучше вообще избегать подобных апдейтов.
...
Рейтинг: 0 / 0
15.05.2019, 15:33
    #39813626
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25msLexпропущено...


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

как я понял, из за такой "недетерминированности" мы не можем абсолютно точно сказать, каким значением из нескольких будет обновлена запись, и следует в таком случае вводить дополнительную логику, row_count какой нибудь, или времянку с отсортированными значениями из таблицы-источника?
пусть sql угадывает какое же значение ты хотел получить
...
Рейтинг: 0 / 0
15.05.2019, 15:39
    #39813628
Ёжик25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
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.

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

Всех благодарю. Вопрос закрыт.
...
Рейтинг: 0 / 0
15.05.2019, 15:41
    #39813630
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
TaPaKэто тот оператор которое "это" делает.
"это" вполне может делать и hash aggregate
...
Рейтинг: 0 / 0
15.05.2019, 15:43
    #39813634
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25Но SQL выбирает "первое".
MS как-то не любит распространяться о внутренней кухне, предпочитая просто рассказать про недетерминированность.
В доке к MySQL, например, чётко написано - любая запись обновляется только один раз за запрос. Отсюда и "первой записью" - остальные попытки обновления этой же записи игнорятся, ибо "уже было". А уж какая реально будет "первая" - это фиг знает, бо сортировки в подзапросах (без TOP N) тупо игнорятся (а местами так и вовсе запрещены, вроде).
...
Рейтинг: 0 / 0
15.05.2019, 15:43
    #39813635
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
msLexTaPaKэто тот оператор которое "это" делает.
"это" вполне может делать и hash aggregate
а делает stream aпgregate... или вы предлагаете на этапе join выбрасывать всё?
...
Рейтинг: 0 / 0
15.05.2019, 15:47
    #39813637
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25iap,

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

Код: sql
1.
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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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;
...
Рейтинг: 0 / 0
15.05.2019, 15:50
    #39813640
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
TaPaKmsLexпропущено...

"это" вполне может делать и hash aggregate
а делает stream aпgregate... или вы предлагаете на этапе join выбрасывать всё?
Еще раз, "это" не обязательно делает stream aggregate, "это" может делаться и SQL сервером и через Hash aggregate с aggrtype any
...
Рейтинг: 0 / 0
15.05.2019, 15:53
    #39813642
Ёжик25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
iap,

вообще, конечно, я был очень удивлен такому поведению. Следовало бы, на мой взгляд, возвращать ошибку обновления, как это делается при MERGE. Ну давайте с тем же успехом переменной присваивать "первое" значение из множественного набора результата SELECT. Чего уж там!))))
...
Рейтинг: 0 / 0
15.05.2019, 15:55
    #39813643
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25iap,

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

Поведение странное, но оно задокументировано, что автомат превращает его (поведение) в фичу.
...
Рейтинг: 0 / 0
15.05.2019, 15:57
    #39813646
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25iap,

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

напишите свой SQL Server и управляйте его поведением как пожелаете.
зачем удивляться тому, что поведение соответствует описанию в документации?
...
Рейтинг: 0 / 0
15.05.2019, 16:08
    #39813654
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25iap,

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

Таких моментов много. Например, во многих случаях необязательно строго придерживаться
заявленного стиля даты в функции CONVERT() - сервер сконвертирует даже приблизительно
похожую на дату строку. Разве не безобразие? Строгости к нам, балбесам, не хватает!
...
Рейтинг: 0 / 0
15.05.2019, 16:08
    #39813656
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE FROM обновляет по первому значению результата джойна
Ёжик25iap,

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

https://feedback.azure.com/forums/908035-sql-server
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / UPDATE FROM обновляет по первому значению результата джойна / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]