2013-08-28 2 views
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 

Но мне нужно отчетливое на ObjectId я имею в виду categoryid и groupid не важно для меня что-то нужно как следующее:

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

Или

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

оба выше результата это хорошо для меня, и оба из них, как вы видите, это настоящий рекорд (как вы видите, в первом запросе)

Итак, как я могу получить этот результат? каков самый быстрый способ сделать это? любое предложение?

ответ

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] 
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] 
0

Вот что мне пришло в голову. Функция Row_Number выдаст автоматически увеличивающийся номер для каждой строки в разделе по разделу, в этом случае 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 
Смежные вопросы