SQL 从前 1 开始加入表格

SQL Join Tables from Top 1

我在 Whosebug 上做了很多搜索,但无法调整其他 SQL 加入 "Top 1" 对我自己案例的回答,所以我希望其他人可以指出我遗漏的内容。

表A

UniqueTableID    TaskID     ReferenceID
1                Task_1     Group_1
2                Task_2     Group_2
3                Task_2     Group_3
4                Task_3     Group_4
5                Task_3     Group_5
6                Task_4     Group_6

表B

GroupID     GroupName
Group_1     Group_AAA
Group_2     Group_BBB
Group_3     Group_CCC
Group_4     Group_DDD
Group_5     Group_EEE
Group_6     Group_FFF

我想要的是 return 每个 TaskID (TableA.ReferenceID = TableB.GroupID) 的 GroupName。至于具有多个 GroupName 引用的 TaskID,我不关心哪个是 returned,所以我尝试使用 TOP 1.

此查询(及其许多变体):

SELECT A.TaskID, B.GroupName
FROM [TableA] A
JOIN [TableB] B
ON B.GroupID = (
    SELECT TOP 1 [GroupID] 
    FROM [TableB] 
    WHERE [GroupID] = A.ReferenceID
)

给我这个 table:

结果

TaskID      GroupName
Task_1      Group_AAA
Task_2      Group_BBB
Task_2      Group_CCC
Task_3      Group_DDD
Task_3      Group_EEE
Task_4      Group_FFF

我怎样才能得到这个:

想要的结果

TaskID      GroupName
Task_1      Group_AAA
Task_2      Group_BBB
Task_3      Group_DDD
Task_4      Group_FFF

感谢您的宝贵时间和帮助!

我认为最好的方法是使用行号。

虽然您可以在主要 table 上进行分组(如 Ron Smith 的回答),但您必须按所有不是 GroupName 的列进行分组。使用您不使用的行号加入 table。

以下是如何为您的数据执行此操作的示例:

SELECT A.TaskID, s.GroupName
FROM [TableA] A
JOIN (SELECT [GroupID],
             [GroupName],
             ROW_NUMBER() OVER (Partition By GroupID ORDER BY GroupName) AS RN
) as subselect s
ON A.ReferenceID = s.GroupID AND s.RN = 1

说明:

您正在使用行号为子查询中的每个项目提供唯一编号。您可以选择分区依据(在本例中为 GroupID)和排序依据(在本例中为 GroupName)。因为您只有 select RN = 1 的项目,您将始终通过此查询获得最低的 GroupName。但您可以根据需要更改顺序。

按照我的设置,您会得到与您的示例相同的结果,但我认为如何更改它已经很清楚了。

如果您希望每个任务的第一个 GroupName 按字母顺序排列,您可以使用 min:

SELECT
    A.TaskID,
    min(B.GroupName) as GroupName
FROM [TableA] A
    JOIN [TableB] B
    ON B.GroupID = A.ReferenceID
GROUP BY A.TaskID

使用这个:

declare @data1 as table(UniqueTableID int primary key ,TaskID varchar(50),ReferenceID varchar(50))
insert into @data1 values (1,'Task_1','Group_1')
insert into @data1 values (2,'Task_2','Group_2')
insert into @data1 values (3,'Task_2','Group_3')
insert into @data1 values (4,'Task_3','Group_4')
insert into @data1 values (5,'Task_3','Group_5')
insert into @data1 values (6,'Task_4','Group_6')

declare @data2 as table(GroupID varchar(50),GroupName varchar(50))
insert into @data2 values ('Group_1','Group_AAA')
insert into @data2 values ('Group_2','Group_BBB')
insert into @data2 values ('Group_3','Group_CCC')
insert into @data2 values ('Group_4','Group_DDD')
insert into @data2 values ('Group_5','Group_EEE')
insert into @data2 values ('Group_6','Group_FFF')

SELECT B.TaskID,A.GroupName
FROM @data2 A INNER JOIN (select distinct TaskID,(select top 1 ReferenceID from @data1 d2 where d2.TaskID = d1.TaskID)as ReferenceID from @data1 d1) B
ON A.GroupID = B.ReferenceID