Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите новичку с циклом / 23 сообщений из 23, страница 1 из 1
04.07.2019, 10:12
    #39833695
andreych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
В связи с "импортозамещением" перегоняют с Oracle на MS SQL, хотя чего тут замещенного не понимаю. Ну ладно.
Проблема такова.
Есть две таблицы по структуре абсолютно одинаковы, периодически в одной нужно обновлять данные другой таблицы.
В Oracle я сделал бы так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for rec in (
select 
id, 
sname 
from t1
)
loop
update t2
set t2.sname = rec.sname
where t2.id = rec.id
end loop


Как такую конструкцию повторить в ms sql, конкретно 2012 сервер?
В postgres в принципе аналогично, а вот с как то не срастается.
...
Рейтинг: 0 / 0
04.07.2019, 10:20
    #39833700
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Код: sql
1.
2.
3.
4.
Update t2
Set sname = rec.sname
From t1 rec
join t2 on t2.id = rec.id
...
Рейтинг: 0 / 0
04.07.2019, 10:27
    #39833703
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Код: sql
1.
2.
3.
4.
UPDATE t2
SET t2.[name]=t1.[name]
FROM t2 JOIN t1 ON t2.id=t1.id
WHERE NOT EXISTS(SELECT t2.[name] INTERSECT SELECT t1.[name]);
...
Рейтинг: 0 / 0
04.07.2019, 10:32
    #39833705
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
iap,
подскажите
авторNOT EXISTS(SELECT t2.[name] INTERSECT SELECT t1.[name])
такое живёт лучше чем t2.[name] <> t1.[name], без индексов и тп?
ну и значительно шире вариант
...
Рейтинг: 0 / 0
04.07.2019, 10:37
    #39833711
andreych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Спасибо, понял куда копать
...
Рейтинг: 0 / 0
04.07.2019, 10:38
    #39833714
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
TaPaKiap,
подскажите
авторNOT EXISTS(SELECT t2.[name] INTERSECT SELECT t1.[name])
такое живёт лучше чем t2.[name] <> t1.[name], без индексов и тп?
ну и значительно шире вариантПо крайней мере NULL здесь не равен NULL.
И да, используется индекс, если он есть.
Мы тут как-то это обсуждали несколько лет назад.

Может, t2.[name] <> t1.[name] OR t2.[name] IS NULL AND t1.[name] IS NOT NULL OR t2.[name] IS NOT NULL AND t1.[name] IS NULL и быстрее отработает, но запись громоздкая.
...
Рейтинг: 0 / 0
04.07.2019, 10:40
    #39833715
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
iapTaPaKiap,
подскажите
пропущено...

такое живёт лучше чем t2.[name] <> t1.[name], без индексов и тп?
ну и значительно шире вариантПо крайней мере NULL здесь не равен NULL.
И да, используется индекс, если он есть.
Мы тут как-то это обсуждали несколько лет назад.

Может, t2.[name] <> t1.[name] OR t2.[name] IS NULL AND t1.[name] IS NOT NULL OR t2.[name] IS NOT NULL AND t1.[name] IS NULL и быстрее отработает, но запись громоздкая.
ясно
красота сейчас мало интересует, именно update не ключевых полей
...
Рейтинг: 0 / 0
04.07.2019, 11:03
    #39833727
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
TaPaK,

Если грубо, то только вариант exists(select a, b, c intersect select d, e, а) может быть преобразован оптимизатором в обычные предикаты. Соответственно, сохранится профит от индексов.

ЗЫ: Сугубо личный опыт.
...
Рейтинг: 0 / 0
04.07.2019, 11:35
    #39833743
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
invmTaPaK,

Если грубо, то только вариант exists(select a, b, c intersect select d, e, а) может быть преобразован оптимизатором в обычные предикаты. Соответственно, сохранится профит от индексов.

ЗЫ: Сугубо личный опыт.А NOT EXISTS() не прокатит?
...
Рейтинг: 0 / 0
04.07.2019, 12:02
    #39833755
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
iap,

Сравните:
Код: 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.
33.
34.
35.
use tempdb;
go

create table dbo.t1 (id int identity primary key, f int, v int);
create table dbo.t2 (id int identity primary key, f int, v int);

create index IX_t1__f on dbo.t1 (f);
create index IX_t2__f on dbo.t2 (f);
go

set statistics xml on;

update a
 set
  v = b.v
from
 dbo.t1 a join
 dbo.t2 b on b.id = a.id
where
 exists(select a.f intersect select b.f);

update a
 set
  v = b.v
from
 dbo.t1 a join
 dbo.t2 b on b.id = a.id
where
 not exists(select a.f intersect select b.f);

set statistics xml off;
go
 
drop table dbo.t1, dbo.t2;
go
...
Рейтинг: 0 / 0
04.07.2019, 13:45
    #39833814
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
andreych,

присмотитесь к MERGE. Он позволяет отдим запросом, в идеале даже за один проход построить полную SCD-2 логику. Т.е. обновить (если изменились) общие строки, добавить отсутствующие и удалить лишние.

P.S. MERGE, к тому же, является частью ANSI SQL
...
Рейтинг: 0 / 0
04.07.2019, 13:46
    #39833817
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
...
Рейтинг: 0 / 0
04.07.2019, 13:48
    #39833819
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Yuri Abeleandreych,

присмотитесь к MERGE. Он позволяет отдим запросом, в идеале даже за один проход построить полную SCD-2 логику. Т.е. обновить (если изменились) общие строки, добавить отсутствующие и удалить лишние.

P.S. MERGE, к тому же, является частью ANSI SQLНо не в таком полном виде, как предложил Microsoft.
Кажется, там не прописан DELETE. Хотя, может, я отстал.
...
Рейтинг: 0 / 0
04.07.2019, 13:55
    #39833828
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
iap,

WHEN NOT MATCHED BY SOURCE DELETE, например.
...
Рейтинг: 0 / 0
04.07.2019, 13:57
    #39833830
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
iapP.S. MERGE, к тому же, является частью ANSI SQLНо не в таком полном виде, как предложил Microsoft.
Кажется, там не прописан DELETE. Хотя, может, я отстал.[/quote]
Да не, DELETE-то возможен и в ANSI, а вот в MSSQL добавлена возможность проверить на каком из концов отсутствует. Т.е. NOT MATCHED by SOURCE
...
Рейтинг: 0 / 0
04.07.2019, 13:58
    #39833832
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Владтслав опередил :-)
...
Рейтинг: 0 / 0
04.07.2019, 15:15
    #39833872
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Владислав Колосовiap,

WHEN NOT MATCHED BY SOURCE DELETE, например.имхо, iap говорил про стандарт, про ANSI SQL
А в нём, похоже, всё пока ограничивается INSERT / UPDATE

Merge (SQL)
...
Рейтинг: 0 / 0
04.07.2019, 15:18
    #39833873
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
court,

Ну что вы, по вашей же ссылке, первая строка:авторIt was officially introduced in the SQL:2003 standard, and expanded in the SQL:2008 standard.
...
Рейтинг: 0 / 0
04.07.2019, 15:21
    #39833876
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Ну да и хрен с ним. Задачу решает и чудно!
...
Рейтинг: 0 / 0
04.07.2019, 16:31
    #39833932
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Ennor Tiegaelcourt,

Ну что вы, по вашей же ссылке, первая строка:авторIt was officially introduced in the SQL:2003 standard, and expanded in the SQL:2008 standard .
Да, я тоже на это "расширено" обратил внимание, но нигде не нашел, в чем же выглядело это "расширение" :)
А так как статья по ссылке представляет (я так понимаю) описание посл.версии, то видимо расширение не относилось к добавлению DELETE

имхо
...
Рейтинг: 0 / 0
04.07.2019, 16:34
    #39833934
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
courtА так как статья по ссылке представляет (я так понимаю) описание посл.версии, то видимо расширение не относилось к добавлению DELETEтем более, что ниже, говорится про реализации в разных СУБД, и там, конкретно про MS SQL сказано так
Microsoft SQL Server extends with supporting guards and also with supporting Left Join via WHEN NOT MATCHED BY SOURCE clauses .
...
Рейтинг: 0 / 0
04.07.2019, 16:40
    #39833943
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
с версии 2014, как минмум, MERGE работает в полном объеме. Всё, приняли и забыли

P.S. Вот зря я ANSI SQL упомянул! Понесло народ совсем вдаль от темы топика.
...
Рейтинг: 0 / 0
04.07.2019, 16:44
    #39833952
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите новичку с циклом
Yuri Abeleс версии 2014, как минмум, MERGE работает в полном объеме. Всё, приняли и забыли

P.S. Вот зря я ANSI SQL упомянул! Понесло народ совсем вдаль от темы топика.MERGE с первой же версии, с 2008, в МС СКЛ работает в полном объеме (INSERT / UPDATE / DELETE)
И это есть гуд :)

Просто интересно, почему в ANSI стандарте не сделали так же ?
Реально ж удобнее когда есть сразу три "пути" синхронизации в одном операторе ...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите новичку с циклом / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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