Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
tunknown Member Откуда: Сообщений: 766 |
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] Ответить | Цитировать Сообщить модератору |
tunknown Member Откуда: Сообщений: 766 |
Здравствуй, курсор? |
||
26 ноя 18, 11:22 [21744617] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
UPDATE #t1 SET f2=f2+(SELECT SUM(f1) FROM #t1)Так? |
26 ноя 18, 11:24 [21744618] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
UPDATE #t1 SET f2+=(SELECT SUM(f1) FROM #t1) |
||
26 ноя 18, 11:25 [21744620] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Что-то я запутался с именами таблиц...UPDATE #t2 SET f2+=(SELECT SUM(f1) FROM #t1);Заблудился в трёх соснах ![]() |
26 ноя 18, 11:27 [21744631] Ответить | Цитировать Сообщить модератору |
tunknown Member Откуда: Сообщений: 766 |
В примере пройдёт. У меня более сложный случай с хитрыми CASE по обеим таблицам в SET. Видимо, только курсор. |
||
26 ноя 18, 11:47 [21744666] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
Однако, CROSS JOIN там, очевидно, недопустим. Можно как-то связать таблицы? Или хотя бы пронумеровать записи и связать по номерам? Иначе в UPDATE каждая строка присутствует несколько раз и результат становится непредсказуемым. |
||
26 ноя 18, 11:55 [21744686] Ответить | Цитировать Сообщить модератору |
tunknown Member Откуда: Сообщений: 766 |
|
||
26 ноя 18, 12:06 [21744707] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
|
||||||
26 ноя 18, 12:17 [21744730] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
покажите нужный результат апдейта для вашего примера, какой должна быть на выходе таблица #t1? |
||
26 ноя 18, 12:18 [21744733] Ответить | Цитировать Сообщить модератору |
tunknown Member Откуда: Сообщений: 766 |
Я привёл более простой пример, нужно более сложное условие 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 |
||
26 ноя 18, 12:39 [21744782] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
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] Ответить | Цитировать Сообщить модератору |
tunknown Member Откуда: Сообщений: 766 |
Точно. Благодарю за идею. |
||
26 ноя 18, 13:30 [21744895] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |