我希望有人可以帮我解决以下问题。
我需要根据2列或3列的组合选择唯一的行。它基本上是一个3级的层次表,我建立了PK作为层次结构中的parentId。
要设置所有内容,请运行以下脚本:
-- ===================
-- 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
第一次插入位置根本不是问题,我在第一次插入时想要的只是唯一的位置名称。
现在在我的第二次插入时,我需要能够分辨出ExternalSource.locname2&如果有意义的话,Location.LocationName以“组合”的方式是唯一的......
如果它们是唯一的,那么我需要选择第2级的位置名称。
以下是一个例子:
以下是从ExternalSource
执行select *时的结果locname1 locname2 locname3
位置1楼层1房间123
位置2楼层2房间234
位置3楼层2房间111
鉴于上述情况,locname2上只有一个Floor1,所以没有问题但是你可以看到locname2列上有两个Floor2。我需要一种方法来检查locname2 + locname1上的值是否在“合并”时是唯一的。如果他们是我应该选择它们。
这是第二次插入期间select的预期输出:
1 1 Floor1 1
1 2 Floor2 1
1 3 Floor2 1
但是我们可以说ExternalSource的输出在哪里:
locname1 locname2 locname3
位置1楼层1房间123
位置2楼层2房间234
位置2 Floor2 Room111
注意上面的粗体Location2,因为locname2 + locname1上有两行具有相同的值,它不再使它独特,然后所需的输出看起来像这样:
1 1 Floor1 1
1 3 Floor2 1
答案 0 :(得分:0)
所以你想在ExternalSource中按两列分组......?
select MAX(LocationID), Locname1, Locname2, 1 from ExternalSource
group by Locname1, Locname2