根据行级唯一性(列的组合)选择行

时间:2012-07-04 06:40:07

标签: sql tsql

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

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

1 个答案:

答案 0 :(得分:0)

所以你想在ExternalSource中按两列分组......?

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