2012-10-16 96 views
5

對於SQL Server數據倉庫,我需要匹配包含大致相同數據的兩個表。合併具有重複數據的表

顯然有比這更給它,所以重新定義任務不:-)

一個選項考慮2個表,A和B

表A:

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

表B:

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

合併時(在此申請祕密IT - SQL),它應該變成

A_B:

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

使用T-SQL中的任何溶液是優選的,性能是不是一個問題。如果SSIS是一個更簡單的選擇,我可以忍受這一點。


這裏是一個腳本,用於創建測試環境供您玩耍。

/****** 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

爲什麼a.110比賽A220? – podiluska

+0

您是否加入'type'字段中的表格? – Gidil

回答

4

假設你想匹配的類型和ID的順序...

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

這是如此優雅,如此美麗。我鞠躬致敬的SQL主:-) –