0

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

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

第一次插入 Location 根本不是问题,我在第一次插入时想要的只是唯一的 Location 名称。

现在,在我的第二次插入时,我需要能够判断 ExternalSource.locname2 和 Location.LocationName 是否以“组合”方式是唯一的,如果这有意义的话......

如果它们是唯一的,那么我需要选择第 2 级的位置名称。

这是一个例子:

以下是您从 ExternalSource 中选择 * 时得到的结果

本地名称1 本地名称2 本地名称3

位置1楼1室123

位置2楼2室234

位置3楼2室111

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

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

1 1 楼层1 1

1 2 楼层 2 1

1 3 楼层2 1

但是让我们说 ExternalSource 的输出看起来像这样:

本地名称1 本地名称2 本地名称3

位置1楼1室123

位置2楼2室234

位置2楼2室111

请注意上面的粗体 Location2,因为 locname2 + locname1 上有两行具有相同的值,它不再使其唯一,然后所需的输出应该如下所示:

1 1 楼层1 1

1 3 楼层2 1

4

1 回答 1

0

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

 select MAX(LocationID),  Locname1, Locname2, 1 from ExternalSource
 group by Locname1, Locname2
于 2012-07-04T08:12:21.467 回答