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

Откуда:
Сообщений: 748
sql 12.0.5557.0 (X64)

Мне раньше не требовалось использовать cross join в update. Я думал, что поведение from одинаково в select и update. Оказалось не так. Можно ли хинтами или ещё как-то сделать update, чтобы from действовал как в select?
begin	tran

create	table	#t1
(	f1	float )
insert	#t1	select	10
insert	#t1	select	20

create	table	#t2
(	f2	float )
insert	#t2	select	1
insert	#t2	select	2

select
	*
from
	#t1
	cross	join	#t2
select	@@RowCount		-- 4

update
	b
set
	f2=	f2+	f1
from
	#t1	a
	cross	join	#t2	b
select	@@RowCount		-- 2

select	*	from	#t1
select	*	from	#t2

rollback
26 ноя 18, 11:02    [21744579]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
tunknown
Member

Откуда:
Сообщений: 748
BOL
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.

Здравствуй, курсор?
26 ноя 18, 11:22    [21744617]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
UPDATE #t1 SET f2=f2+(SELECT SUM(f1) FROM #t1)
Так?
26 ноя 18, 11:24    [21744618]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
iap
UPDATE #t1 SET f2=f2+(SELECT SUM(f1) FROM #t1)

Так?
Или
UPDATE #t1 SET f2+=(SELECT SUM(f1) FROM #t1)
26 ноя 18, 11:25    [21744620]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
Что-то я запутался с именами таблиц...
UPDATE #t2 SET f2+=(SELECT SUM(f1) FROM #t1);
Заблудился в трёх соснах
26 ноя 18, 11:27    [21744631]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
tunknown
Member

Откуда:
Сообщений: 748
iap
Что-то я запутался с именами таблиц...
UPDATE #t2 SET f2+=(SELECT SUM(f1) FROM #t1);
Заблудился в трёх соснах

В примере пройдёт. У меня более сложный случай с хитрыми CASE по обеим таблицам в SET.

Видимо, только курсор.
26 ноя 18, 11:47    [21744666]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
tunknown
Видимо, только курсор
Ой ли?

Однако, CROSS JOIN там, очевидно, недопустим.
Можно как-то связать таблицы? Или хотя бы пронумеровать записи и связать по номерам?
Иначе в UPDATE каждая строка присутствует несколько раз и результат становится непредсказуемым.
26 ноя 18, 11:55    [21744686]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
tunknown
Member

Откуда:
Сообщений: 748
iap
Можно как-то связать таблицы? Или хотя бы пронумеровать записи и связать по номерам?
Иначе в UPDATE каждая строка присутствует несколько раз и результат становится непредсказуемым.
Нужно то, что выглядит, как CROSS и работает, как CROSS. В одной из таблиц BLOB поле, участвующее в условии. Нумерация записей будет равносильна его многократной дупликации.
26 ноя 18, 12:06    [21744707]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
tunknown
iap
Можно как-то связать таблицы? Или хотя бы пронумеровать записи и связать по номерам?
Иначе в UPDATE каждая строка присутствует несколько раз и результат становится непредсказуемым.
Нужно то, что выглядит, как CROSS и работает, как CROSS. В одной из таблиц BLOB поле, участвующее в условии. Нумерация записей будет равносильна его многократной дупликации.
Невозможно обсуждать то, что видите только вы.
tunknown
У меня более сложный случай с хитрыми CASE по обеим таблицам в SET.
26 ноя 18, 12:17    [21744730]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
Shakill
Member

Откуда: мск
Сообщений: 1870
tunknown
Нужно то, что выглядит, как CROSS и работает, как CROSS. В одной из таблиц BLOB поле, участвующее в условии. Нумерация записей будет равносильна его многократной дупликации.

покажите нужный результат апдейта для вашего примера, какой должна быть на выходе таблица #t1?
26 ноя 18, 12:18    [21744733]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
tunknown
Member

Откуда:
Сообщений: 748
Shakill
покажите нужный результат апдейта для вашего примера, какой должна быть на выходе таблица #t1?

Я привёл более простой пример, нужно более сложное условие
create	table	#t1
(	word	varchar ( 256 ) )
insert	#t1	( word )	values	( '01' ),( '02' ),( '03' )

create	table	#t2
(	txt	varchar ( max )
	,list	varchar ( max ) )
insert	#t2	( txt )	values	( 'q 01 w 02 e 03 r 03 t' ),( 'a 01 b' ),( 'c 04 d' )

Получить нужно таблицу

txt                     list
--------------------- -----
q 01 w 02 e 03 r 03 t 01 02 03
a 01 b 01
c 04 d NULL
26 ноя 18, 12:39    [21744782]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
tunknown
Получить нужно таблицу

txt                     list
--------------------- -----
q 01 w 02 e 03 r 03 t 01 02 03
a 01 b 01
c 04 d NULL
update t
 set
  list = rtrim(s.x.value('.', 'varchar(max)'))
from
 #t2 t outer apply
 (select word + ' ' from #t1 where t.txt like '% ' + word + ' %' for xml path(''), type) s(x);
26 ноя 18, 13:12    [21744856]     Ответить | Цитировать Сообщить модератору
 Re: update vs cross join  [new]
tunknown
Member

Откуда:
Сообщений: 748
invm
outer apply

Точно. Благодарю за идею.
26 ноя 18, 13:30    [21744895]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить