powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите новичку с циклом
23 сообщений из 23, страница 1 из 1
Помогите новичку с циклом
    #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
Помогите новичку с циклом
    #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
Помогите новичку с циклом
    #39833703
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
Помогите новичку с циклом
    #39833705
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,
подскажите
авторNOT EXISTS(SELECT t2.[name] INTERSECT SELECT t1.[name])
такое живёт лучше чем t2.[name] <> t1.[name], без индексов и тп?
ну и значительно шире вариант
...
Рейтинг: 0 / 0
Помогите новичку с циклом
    #39833711
andreych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, понял куда копать
...
Рейтинг: 0 / 0
Помогите новичку с циклом
    #39833714
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
Помогите новичку с циклом
    #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
Помогите новичку с циклом
    #39833727
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

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

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

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

ЗЫ: Сугубо личный опыт.А NOT EXISTS() не прокатит?
...
Рейтинг: 0 / 0
Помогите новичку с циклом
    #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
Помогите новичку с циклом
    #39833814
Фотография Yuri Abele
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreych,

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

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

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

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

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

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

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

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

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

имхо
...
Рейтинг: 0 / 0
Помогите новичку с циклом
    #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
Помогите новичку с циклом
    #39833943
Фотография Yuri Abele
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с версии 2014, как минмум, MERGE работает в полном объеме. Всё, приняли и забыли

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

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

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


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