2012-10-16 6 views
5

W przypadku serwera danych SQL Server należy dopasować 2 tabele zawierające mniej więcej te same dane.Scalanie tabel ze zduplikowanymi danymi

Jest oczywiście więcej niż tylko to, więc redefinicji zadanie nie jest opcją :-)

Biorąc pod uwagę 2 tabele A i B

Tabela A:

id | fid | type 
------------------- 
100 | 1 | cookies 
110 | 1 | muffins 
120 | 1 | muffins 

Tabela B:

id | fid | type 
-------------------- 
a220 | 1 | muffins 
b220 | 1 | muffins 

Kiedy połączyła się (za tajne tutaj - SQL), powinna ona stać

A_B:

A_id | B_id | fid | type 
--------------------------- 
100 | NULL | 1 | cookies 
110 | a220 | 1 | muffins 
120 | b220 | 1 | muffins 

Każdy roztwór przy użyciu T-SQL to korzystne wykonanie nie jest problemem. Jeśli SSIS jest prostszą opcją, mogę z tym żyć.


Oto skrypt do tworzenia środowiska testowego, w którym można się bawić.

/****** Object: Table [dbo].[B] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[B](
    [id] [varchar](10) NULL, 
    [fid] [int] NULL, 
    [type] [varchar](50) NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
INSERT [dbo].[B] ([id], [fid], [type]) VALUES (N'a220', 1, N'muffins') 
INSERT [dbo].[B] ([id], [fid], [type]) VALUES (N'b220', 1, N'muffins') 
/****** Object: Table [dbo].[A] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[A](
    [id] [varchar](10) NULL, 
    [fid] [int] NULL, 
    [type] [varchar](50) NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
INSERT [dbo].[A] ([id], [fid], [type]) VALUES (N'100', 1, N'cookies') 
INSERT [dbo].[A] ([id], [fid], [type]) VALUES (N'110', 1, N'muffins') 
INSERT [dbo].[A] ([id], [fid], [type]) VALUES (N'120', 1, N'muffins') 
+2

Dlaczego a.110 mecz A220? – podiluska

+0

Czy dołączasz do tabel w polu "typ"? – Gidil

Odpowiedz

4

Zakładając chcesz dopasować od rodzaju i kolejności identyfikatory ...

select a.id, b.id, ISNULL(a.fid,b.fid) fid, ISNULL(a.type,b.type) type 
from 
    (select *, ROW_NUMBER() over (partition by type order by id) rn from a) a 
     full outer join 
    (select *, ROW_NUMBER() over (partition by type order by id) rn from b) b 
     on a.rn=b.rn 
     and a.type = b.type 
order by a.id  
+0

To jest takie eleganckie, takie piękne. Kłaniam się Mistrzowi SQL :-) –