powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос
9 сообщений из 9, страница 1 из 1
Помогите написать запрос
    #39956667
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

У меня есть такой запрос на слияние данных из промежуточтной таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
MERGE [dbo].[bl] bl 
    USING [dbo].[bls] s
ON (s.[ServerName] = bl.[ServerName]) AND (s.[DBName] = bl.[DBName]) 
AND (s.[BackupType] = bl.[BackupType]) AND (s.[BackupFinishDate] = bl.[BackupFinishDate]) 
AND (s.[PhysicalDeviceName] = bl.[PhysicalDeviceName]) AND (s.[DBGroupID] = bl.[DBGroupID])
WHEN NOT MATCHED BY TARGET 
    THEN INSERT ([ServerName], [DBGroupID], [DBName], [BackupType], [BackupFinishDate], [PhysicalDeviceName])         
	VALUES (s.[ServerName], s.[DBGroupID], s.[DBName], s.[BackupType], s.[BackupFinishDate], s.[PhysicalDeviceName])
WHEN NOT MATCHED BY SOURCE THEN
DELETE;



Можно ли его переделать таким образом, чтобы затрагивались только записи с определенным номером группы (DBGroupID)?

Например, в обеих таблицах есть записи с номером групп 1, 2 и 3. Я хочу слить только записи у которых номер группы 1. А именно, почистить записи с номером группы 1 из таблицы [bl], которые отсутствуют в источнике ([dbo].[bls]). Добавить новые записи с номером группы 1 из источника ([bls]) в целевую таблицу ([bl]). А остальные не трогать.

Уж очень не хочется под каждую группу таблицу создавать.

Спасибо.
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39956678
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
with bl as (select * from [dbo].[bl] where DBGroupID = 1)
merge into bl
using ...
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39957194
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
with bl as (select * from [dbo].[bl] where DBGroupID = 1)
merge into bl
using ...



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with bl as (select * from [dbo].[bl] where DBGroupID = 1)
merge into bl
    USING [dbo].[bls] s
ON (s.[ServerName] = bl.[ServerName]) AND (s.[DBName] = bl.[DBName]) 
AND (s.[BackupType] = bl.[BackupType]) AND (s.[BackupFinishDate] = bl.[BackupFinishDate]) 
AND (s.[PhysicalDeviceName] = bl.[PhysicalDeviceName]) AND (s.[DBGroupID] = bl.[DBGroupID])
WHEN NOT MATCHED BY TARGET 
    THEN INSERT ([ServerName], [DBGroupID], [DBName], [BackupType], [BackupFinishDate], [PhysicalDeviceName])         
	VALUES (s.[ServerName], s.[DBGroupID], s.[DBName], s.[BackupType], s.[BackupFinishDate], s.[PhysicalDeviceName])
WHEN NOT MATCHED BY SOURCE THEN
DELETE;



Не работает. В таблице bl было 2 записи. Одна с группой номер 1 и другая с группой номер 3. В таблице bls было 3 записи. Две с группой номер 1 и одна с группой номер 3. В результате запрос все правильно сделал по группе номер 1, но вставил дубликат с группой номер 3. Теперь в таблице bl 2 записи с группой номер 1 и две с группой номер 3, что есть неправильно.

Я нашел более простое решение: сначала удалить записи с номером один и потом вставить все записи с группой номер 1.

Но все равно интересно можно ли слияние делать с фильтрами/подзапросами.
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39957202
_human
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m
интересно можно ли слияние делать с фильтрами

фильтрьі(CTE) работают, хотя и не ремендуются.

Roust_m
Не работает. В таблице bl было 2 записи. Одна с группой номер 1 и другая с группой номер 3. В таблице bls было 3 записи. Две с группой номер 1 и одна с группой номер 3. В результате запрос все правильно сделал по группе номер 1, но вставил дубликат с группой номер 3. Теперь в таблице bl 2 записи с группой номер 1 и две с группой номер 3, что есть неправильно.

бьіло бьі бьістрее набросать семпл данньіх чем весь етот текст сочинять

Roust_m
запрос на слияние данных

как по мне merge здесь ненужен
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39957257
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m
Не работает. В таблице bl было 2 записи. Одна с группой номер 1 и другая с группой номер 3. В таблице bls было 3 записи. Две с группой номер 1 и одна с группой номер 3. В результате запрос все правильно сделал по группе номер 1, но вставил дубликат с группой номер 3. Теперь в таблице bl 2 записи с группой номер 1 и две с группой номер 3, что есть неправильно.
При таком раскладе в using тоже должно быть CTE с фильтром
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39957289
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Roust_m
Не работает. В таблице bl было 2 записи. Одна с группой номер 1 и другая с группой номер 3. В таблице bls было 3 записи. Две с группой номер 1 и одна с группой номер 3. В результате запрос все правильно сделал по группе номер 1, но вставил дубликат с группой номер 3. Теперь в таблице bl 2 записи с группой номер 1 и две с группой номер 3, что есть неправильно.
При таком раскладе в using тоже должно быть CTE с фильтром

В using можно обычный подзапрос использовать.


Код: sql
1.
2.
;with t as (select .. from target_table where ..)
merge t using (select .. from source_table where .. ) on ...
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39957312
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
В using можно обычный подзапрос использовать.
Ну это же тоже самое, что и CTE. Так что дело вкуса.
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39957404
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
msLex
В using можно обычный подзапрос использовать.
Ну это же тоже самое, что и CTE. Так что дело вкуса.

Это я в качестве отличия target (только CTE) от source (можно и подзапросом)
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39957516
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кажется можно ещё и к WHEN NOT MATCHED BY TARGET добавить условие
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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