/ / Как да актуализирате различни колони в зависимост от разликите между таблиците - sql, sql-сървър

Как да актуализирате различни колони в зависимост от разликите между таблиците - sql, sql-server

Имам три таблици, таблица 1, таблица 2 и таблица 3. Таблица 1 записва всички съществуващи записи, а таблица 2 записва делта (нови актуализации), които ще бъдат приложени към таблица 1.

Таблица 3 е получената таблица.

Таблица 1 и 3 структура: ID е основният ключ ИД, дата, местоположение, възраст, брой

Структура на таблица 2: ID е първичен ключ ID, дата, местоположение, възраст, брой, ChangeType

Таблица 2 записва нови стойности за актуализация само за полета, променени в таблица 1.

Например:

маса 1

1, 03/03/2017, A, 11, 1
2, 01/03/2017, B, 39, 1
3, 01/01/2017, D, 1, 1

Таблица 2

2, 03/03/2017,NULL, NULL,2, Update
1, NULL, CC, NULL, NULL, Update

Следователно таблица 3 трябва да бъде

1, 03/03/2017, CC, 11, 1
2, 03/03/2017, B, 39, 2
3, 01/01/2017, D, 1, 1

Всички предложения ще бъдат оценени.

GO
/****** Object:  Table [dbo].[Table_1]    Script Date: 03/03/2017 10:41:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table_1](
[ID] [int] NOT NULL,
[date] [date] NULL,
[location] [nvarchar](50) NULL,
[age] [int] NULL,
[count] [int] NULL
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[Table_2]    Script Date: 03/03/2017 10:41:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table_2](
[ID] [int] NOT NULL,
[date] [date] NULL,
[location] [nvarchar](50) NULL,
[age] [int] NULL,
[count] [int] NULL,
[ChangeTyppe] [nvarchar](10) NULL
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[Table_3]    Script Date: 03/03/2017 10:41:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table_3](
[ID] [int] NOT NULL,
[date] [date] NULL,
[location] [nvarchar](50) NULL,
[age] [int] NULL,
[count] [int] NULL
) ON [PRIMARY]

GO
INSERT [dbo].[Table_1] ([ID], [date], [location], [age], [count]) VALUES (1, CAST(0x863C0B00 AS Date), N"A", 11, 1)
GO
INSERT [dbo].[Table_1] ([ID], [date], [location], [age], [count]) VALUES (2, CAST(0x843C0B00 AS Date), N"B", 39, 1)
GO
INSERT [dbo].[Table_1] ([ID], [date], [location], [age], [count]) VALUES (3, CAST(0x493C0B00 AS Date), N"D", 1, 1)
GO
INSERT [dbo].[Table_2] ([ID], [date], [location], [age], [count], [ChangeTyppe]) VALUES (2, CAST(0x863C0B00 AS Date), NULL, NULL, 2, N"Update")
GO
INSERT [dbo].[Table_2] ([ID], [date], [location], [age], [count], [ChangeTyppe]) VALUES (1, NULL, N"CC", NULL, NULL, N"Update")
GO

Отговори:

2 за отговор № 1

Ако всичко, от което се нуждаете, е еднократно нещо, тогава това трябва да работи.

Отляво Присъединете се към двете таблици на първичния ключ и вземете стойността от T2, ако не е нула. Вземете стойността от T1, ако стойността от 2 е нулева.

Coalesce ще върне първата стойност, която не е нулева.

Стойностите от T2 ще бъдат нулеви, ако редът не съществува в T2 или ако стойността в T2 е нулева - за ID.

INSERT dbo.Table_3
( ID, date, location, age, count )
SELECT t1.ID ,
[date] = COALESCE(t2.date, t1.date) ,
[location] = COALESCE(t2.location, t1.location) ,
[age] = COALESCE(t2.age, t1.age) ,
[count] = COALESCE(t2.count, t1.count)
FROM dbo.Table_1 t1
LEFT OUTER JOIN dbo.Table_2 t2 ON t2.ID = t1.ID