3

这是我的查询

SELECT 
  [MO].[Id] AS [ObjectId],
  [CA].[Id] As [CategoryId],
  [GR].[Id] AS [GroupId]
FROM [MYOBJECT] AZ [MO]
INNER JOIN [Category] AS [CA] ON [CA].[Id] = [MO].[CategoryId]
Inner Join [Group] AS [GR] ON [GR].[CategoryId] = [CA].[ID]

结果是:

ObjectId    CategoryId   GroupId
-----------------------------------
1             1           1
1             2           2
2             1           1
2             2           2

但是我需要 DistinctObjectId我的意思是对我categoryid来说groupid并不重要我需要类似以下的东西:

 ObjectId    CategoryId   GroupId
-----------------------------------
1             1           1
2             1           1

或者

ObjectId    CategoryId   GroupId
-----------------------------------
1             2           2
2             1           1

以上两个结果对我来说都很好,而且你看到的都是真实记录(如你在第一个查询中看到的)

那么,我怎样才能得到这个结果呢?最快的方法是什么?有什么建议吗?

4

3 回答 3

4

GROUP BY在其他列上使用和使用一些聚合函数:

SELECT 
  [MO].[Id] AS [ObjectId],
  MIN([CA].[Id]) As [CategoryId],
  MIN([GR].[Id]) AS [GroupId]
FROM [MYOBJECT] AZ [MO]
INNER JOIN [Category] AS [CA] ON [CA].[Id] = [MO].[CategoryId]
Inner Join [Group] AS [GR] ON [GR].[CategoryId] = [CA].[ID]
GROUP BY [MO].[Id]
于 2013-08-28T11:22:45.570 回答
2

尝试这个

;WITH cte AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY [MO].[Id] ORDER BY [CA].[Id]) As rno
  [MO].[Id] AS [ObjectId],
  [CA].[Id] As [CategoryId],
  [GR].[Id] AS [GroupId]
FROM [MYOBJECT] AZ [MO]
INNER JOIN [Category] AS [CA] ON [CA].[Id] = [MO].[CategoryId]
INNER JOIN [Group] AS [GR] ON [GR].[CategoryId] = [CA].[ID]
)

SELECT * 
FROM cte WHERE rno=1

或者你可以这样使用,因为 CategoryId 和 GroupId 并不重要

SELECT 
  [MO].[Id] AS [ObjectId],
  MAX([CA].[Id]) As [CategoryId],
  MAX([GR].[Id]) AS [GroupId]
FROM [MYOBJECT] AZ [MO]
INNER JOIN [Category] AS [CA] ON [CA].[Id] = [MO].[CategoryId]
INNER JOIN [Group] AS [GR] ON [GR].[CategoryId] = [CA].[ID]
GROUP BY  [MO].[Id]
于 2013-08-28T11:20:26.630 回答
0

这就是我想到的。Row_Number 函数将为您的 partition by 子句中的每一行发出一个自动递增的数字,在本例中为 ObjectId 或 MO.Id。然后在外部选择中,我们返回其他列并按新的 RowNum 列进行过滤。

 SELECT A.ObjectId, 
           A.CategoryId ,
           A.GroupId
  FROM  (
            SELECT 
              [MO].[Id] AS [ObjectId],
              [CA].[Id] As [CategoryId],
              [GR].[Id] AS [GroupId],
              ROW_NUMBER() OVER(PARTITION BY [MO].[Id]) AS RowNum
            FROM [MYOBJECT] AZ [MO]
            INNER JOIN [Category] AS [CA] ON [CA].[Id] = [MO].[CategoryId]
            INNER JOIN [Group] AS [GR] ON [GR].[CategoryId] = [CA].[ID]
        ) A
  WHERE A.RowNum = 1
于 2013-08-28T22:25:37.443 回答