2012-10-16 44 views
5

Đối với một kho dữ liệu SQL Server, tôi cần phải khớp 2 bảng có chứa cùng một dữ liệu.Việc hợp nhất các bảng với dữ liệu trùng lặp

Có rõ ràng hơn để nó hơn này, vì vậy xác định lại nhiệm vụ không phải là một lựa chọn :-)

Given 2 bảng A và B

Bảng A:

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

Bảng B:

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

Khi hợp nhất (áp dụng bí mật CNTT tại đây - SQL), nó sẽ trở thành

A_B:

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

Bất kỳ giải pháp sử dụng T-SQL được ưa thích, hiệu suất không phải là một vấn đề. Nếu SSIS là một lựa chọn đơn giản hơn, tôi có thể sống với nó.


Đây là kịch bản để tạo môi trường thử nghiệm để bạn có thể chơi cùng.

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

Tại sao a.110 trận đấu để A220? – podiluska

+0

Bạn có tham gia các bảng trên trường 'loại' không? – Gidil

Trả lời

4

Giả sử bạn muốn kết hợp vào loại và thứ tự của các 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

Điều này thật thanh lịch, rất đẹp. Tôi cúi xuống Thạc sĩ SQL :-) –

Các vấn đề liên quan