5

SQL Server データ ウェアハウスの場合、ほぼ同じデータを含む 2 つのテーブルを照合する必要があります。

明らかにこれ以上のものがあるので、タスクを再定義することはオプションではありません:-)

与えられた 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')
4

1 に答える 1

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       
于 2012-10-16T08:24:54.637 に答える