powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE с таблицей в которой все поля участвуют в PK
4 сообщений из 4, страница 1 из 1
MERGE с таблицей в которой все поля участвуют в PK
    #40063751
Spiridonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Комрады приветствую! Прошу помощи.

Стоит задача:

есть таблица в которой каждый из столбцов участвует в PK:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE [dbo].[table](
	[id_key] [int] NOT NULL,
	[date] [datetime] NOT NULL,
	[id_value] [int] NOT NULL,
 CONSTRAINT [PK_daily_guarantee] PRIMARY KEY CLUSTERED 
(
	[id_key] ASC,
	[date] ASC,
	[id_value] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO



есть тип:
Код: sql
1.
2.
3.
4.
5.
CREATE TYPE [dbo].[table_type] AS TABLE(
	[id_key] [int] NOT NULL,
	[date] [datetime] NOT NULL,
	[id_value] [int] NOT NULL
)



Необходимо построить такой MERGE

Чтобы при подаче на вход набора данных типа
Код: sql
1.
declare @table [dbo].[table_type]


1. Из [dbo].[table] удалились данные, которые не входят во входной набор данных @table. Аналогично delete from [dbo].[table] where id_value in not in (select id_value from @table)
2. В [dbo].[table] вставились данные из @table, которых нет в [dbo].[table]
3. Если есть одинаковые данные в [dbo].[table] и в @table, то ничего не делать.
...
Рейтинг: 0 / 0
MERGE с таблицей в которой все поля участвуют в PK
    #40063808
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в чем сложности?
...
Рейтинг: 0 / 0
MERGE с таблицей в которой все поля участвуют в PK
    #40063843
Spiridonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Собственно сложность в
автор1. Из [dbo].[table] удалились данные, которые не входят во входной набор данных @table. Аналогично delete from [dbo].[table] where id_value in not in (select id_value from @table)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
insert into @table
values
	(...)

MERGE INTO [table] WITH (UPDLOCK) AS dst
    USING(SELECT [id_key]
            ,[date]
            ,[id_value] FROM @table) AS src
    ON dst.id_key = src.[id_key] 
        AND dst.[date] = src.[date] 
        AND dst.[id_value] = src.[id_value] -- надо ли добавлять это условие?
    WHEN NOT MATCHED BY SOURCE THEN -- как здесь удалить строки, которые не входят во входной набор данных @table
        DELETE
    WHEN NOT MATCHED BY TARGET THEN
        INSERT 
            ([id_key]
            ,[date]
            ,[id_value])
        VALUES
            (src.[id_key]
            ,src.[date]
            ,src.[id_value]);
...
Рейтинг: 0 / 0
MERGE с таблицей в которой все поля участвуют в PK
    #40063886
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spiridonov
invm,

Собственно сложность в
автор1. Из [dbo].[table] удалились данные, которые не входят во входной набор данных @table. Аналогично delete from [dbo].[table] where id_value in not in (select id_value from @table)


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
insert into @table
values
	(...)

MERGE INTO [table] WITH (UPDLOCK) AS dst
    USING(SELECT [id_key]
            ,[date]
            ,[id_value] FROM @table) AS src
    ON dst.id_key = src.[id_key] 
        AND dst.[date] = src.[date] 
        AND dst.[id_value] = src.[id_value] -- надо ли добавлять это условие?
    WHEN NOT MATCHED BY SOURCE THEN -- как здесь удалить строки, которые не входят во входной набор данных @table
        DELETE
    WHEN NOT MATCHED BY TARGET THEN
        INSERT 
            ([id_key]
            ,[date]
            ,[id_value])
        VALUES
            (src.[id_key]
            ,src.[date]
            ,src.[id_value]);



Ты фсе правильно написал- все, чего нет в @table, будет удалено

Код: sql
1.
    WHEN NOT MATCHED BY SOURCE THEN DELETE
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MERGE с таблицей в которой все поля участвуют в PK
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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