Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / update vs cross join / 13 сообщений из 13, страница 1 из 1
26.11.2018, 11:02
    #39738401
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
sql 12.0.5557.0 (X64)

Мне раньше не требовалось использовать cross join в update. Я думал, что поведение from одинаково в select и update. Оказалось не так. Можно ли хинтами или ещё как-то сделать update, чтобы from действовал как в select?
Код: 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.
26.
27.
28.
29.
30.
31.
32.
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
...
Рейтинг: 0 / 0
26.11.2018, 11:22
    #39738419
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
BOLUse 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 .
Здравствуй, курсор?
...
Рейтинг: 0 / 0
26.11.2018, 11:24
    #39738420
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
Код: sql
1.
UPDATE #t1 SET f2=f2+(SELECT SUM(f1) FROM #t1)

Так?
...
Рейтинг: 0 / 0
26.11.2018, 11:25
    #39738421
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
iap
Код: sql
1.
UPDATE #t1 SET f2=f2+(SELECT SUM(f1) FROM #t1)


Так?Или
Код: sql
1.
UPDATE #t1 SET f2+=(SELECT SUM(f1) FROM #t1)
...
Рейтинг: 0 / 0
26.11.2018, 11:27
    #39738425
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
Что-то я запутался с именами таблиц...
Код: sql
1.
UPDATE #t2 SET f2+=(SELECT SUM(f1) FROM #t1);

Заблудился в трёх соснах
...
Рейтинг: 0 / 0
26.11.2018, 11:47
    #39738441
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
iapЧто-то я запутался с именами таблиц...
Код: sql
1.
UPDATE #t2 SET f2+=(SELECT SUM(f1) FROM #t1);

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

Видимо, только курсор.
...
Рейтинг: 0 / 0
26.11.2018, 11:55
    #39738445
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
tunknownВидимо, только курсорОй ли?

Однако, CROSS JOIN там, очевидно, недопустим.
Можно как-то связать таблицы? Или хотя бы пронумеровать записи и связать по номерам?
Иначе в UPDATE каждая строка присутствует несколько раз и результат становится непредсказуемым.
...
Рейтинг: 0 / 0
26.11.2018, 12:06
    #39738456
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
iapМожно как-то связать таблицы? Или хотя бы пронумеровать записи и связать по номерам?
Иначе в UPDATE каждая строка присутствует несколько раз и результат становится непредсказуемым.Нужно то, что выглядит, как CROSS и работает, как CROSS. В одной из таблиц BLOB поле, участвующее в условии. Нумерация записей будет равносильна его многократной дупликации.
...
Рейтинг: 0 / 0
26.11.2018, 12:17
    #39738466
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
tunknowniapМожно как-то связать таблицы? Или хотя бы пронумеровать записи и связать по номерам?
Иначе в UPDATE каждая строка присутствует несколько раз и результат становится непредсказуемым.Нужно то, что выглядит, как CROSS и работает, как CROSS. В одной из таблиц BLOB поле, участвующее в условии. Нумерация записей будет равносильна его многократной дупликации.Невозможно обсуждать то, что видите только вы.tunknownУ меня более сложный случай с хитрыми CASE по обеим таблицам в SET.
...
Рейтинг: 0 / 0
26.11.2018, 12:18
    #39738469
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
tunknownНужно то, что выглядит, как CROSS и работает, как CROSS. В одной из таблиц BLOB поле, участвующее в условии. Нумерация записей будет равносильна его многократной дупликации.
покажите нужный результат апдейта для вашего примера, какой должна быть на выходе таблица #t1?
...
Рейтинг: 0 / 0
26.11.2018, 12:39
    #39738489
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
Shakillпокажите нужный результат апдейта для вашего примера, какой должна быть на выходе таблица #t1?
Я привёл более простой пример, нужно более сложное условие
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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' )


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

Код: plaintext
1.
2.
3.
4.
txt                     list
---------------------   -----
q 01 w 02 e 03 r 03 t   01 02 03
a 01 b                  01
c 04 d                  NULL
...
Рейтинг: 0 / 0
26.11.2018, 13:12
    #39738520
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
tunknownПолучить нужно таблицу

Код: plaintext
1.
2.
3.
4.
txt                     list
---------------------   -----
q 01 w 02 e 03 r 03 t   01 02 03
a 01 b                  01
c 04 d                  NULL
Код: sql
1.
2.
3.
4.
5.
6.
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);
...
Рейтинг: 0 / 0
26.11.2018, 13:30
    #39738534
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update vs cross join
invmouter apply
Точно. Благодарю за идею.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / update vs cross join / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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