Sql 基于行级唯一性选择行(列的组合)

Sql 基于行级唯一性选择行(列的组合),sql,tsql,Sql,Tsql,我希望有人能帮我解决以下问题 我需要根据2或3列的组合选择唯一的行。它基本上是一个3级的层次结构表,我在层次结构中将PK作为parentId引用 要设置所有内容,请运行以下脚本: -- =================== -- Source table & data -- =================== IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ExternalS

我希望有人能帮我解决以下问题

我需要根据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楼123室

地点二楼234室

位置3楼2室111

鉴于上述情况,locname2上只有一个Floor1,因此没有问题,但正如您所看到的,locname2列上有两个Floor2。我需要一种方法来检查locname2+locname1上的值在“组合”时是否唯一。如果是,我应该选择两者

这是第二次插入期间select的预期输出:

一楼一楼

1 2楼2 1

1 3楼2 1

但是让我们假设ExternalSource的输出在哪里看起来像这样:

locname1 locname2 locname3

地点1楼123室

地点二楼234室

位置2二楼111室

请注意上面的粗体位置2,因为在locname2+locname1上有两行具有相同的值,因此不再使其唯一,然后所需的输出将如下所示:

一楼一楼


1 3楼层2 1

那么您想在ExternalSource中按两列进行分组

 select MAX(LocationID),  Locname1, Locname2, 1 from ExternalSource
 group by Locname1, Locname2