誰かが次の問題を解決するのを手伝ってくれることを願っています。
2 つまたは 3 つの列の組み合わせに基づいて一意の行を選択する必要があります。基本的には、階層内のparentIdとしてPKを参照して構築する3レベルの階層テーブルです。
すべてを設定するには、次のスクリプトを実行してください。
-- ===================
-- Source table & data
-- ===================
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ExternalSource]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[ExternalSource](
[locname1] [varchar](max) NULL,
[locname2] [varchar](max) NULL,
[locname3] [varchar](max) NULL
) ON [PRIMARY]
END
INSERT [dbo].[ExternalSource] ([locname1], [locname2], [locname3]) VALUES (N'Location1', N'Floor1', N'Room123')
INSERT [dbo].[ExternalSource] ([locname1], [locname2], [locname3]) VALUES (N'Location2', N'Floor2', N'Room234')
INSERT [dbo].[ExternalSource] ([locname1], [locname2], [locname3]) VALUES (N'Location3', N'Floor2', N'Room111')
-- ===================
-- Destination table
-- ===================
CREATE TABLE [dbo].[Location](
[LocationID] [int] IDENTITY(1,1) NOT NULL,
[CompanyID] [tinyint] NOT NULL,
[ParentID] [int] NULL,
[LocationCode] [nvarchar](20),
[LocationName] [nvarchar](60) NOT NULL,
[CanAssign] [bit] NOT NULL)
-- Level 1 records in the hierachy
insert into Location
(
CompanyID,
ParentID,
LocationName,
CanAssign
)
select distinct 1, NULL, ES.locname1, 1
from dbo.ExternalSource ES
where ES.locname1 not in (select LocationName from Location) and ES.locname1 is not null
-- Level 2 records in the hierachy
insert into Location
(
CompanyID,
ParentID,
LocationName,
CanAssign
)
select 1, max(Loc.LocationID), ES.locname2, 1
from ExternalSource ES
left join Location Loc on ES.locname1 = Loc.LocationName
where ES.locname2 not in (select LocationName from Location) and ES.locname2 is not null and ES.locname1 is not null
group by ES.locname2
order by ES.locname2
select * from ExternalSource
select * from Location
Location への最初の挿入はまったく問題ではありません。最初の挿入で必要なのは、一意の Location 名だけです。
2 番目の挿入では、ExternalSource.locname2 と Location.LocationName が「結合」された方法で一意であるかどうかを判断できる必要があります。
それらが一意である場合は、レベル 2 の場所の名前を選択する必要があります。
次に例を示します。
以下は、select * from ExternalSource を実行したときに得られるものです。
locname1 locname2 locname3
ロケーション1 フロア1 ルーム123
ロケーション2 フロア2 ルーム234
Location3 Floor2 Room111
上記のように、locname2 には Floor1 が 1 つしかないため問題はありませんが、locname2 列には Floor2 が 2 つあります。「結合」したときに locname2 + locname1 の値が一意であるかどうかを確認する方法が必要です。もしそうなら、私はそれらの両方を選択する必要があります。
これは、2 番目の挿入中の選択の予期される出力です。
1 1 フロア1 1
1 2 フロア2 1
1 3 フロア2 1
しかし、ExternalSource の出力は次のようになります。
locname1 locname2 locname3
ロケーション1 フロア1 ルーム123
ロケーション2 フロア2 ルーム234
ロケーション2 フロア2 ルーム111
上記の太字の Location2 に注意してください。locname2 + locname1 に同じ値を持つ 2 つの行があるため、それはもう一意ではなく、目的の出力は次のようになります。
1 1 フロア1 1
1 3 フロア2 1