Уникальные записи в подзапросе - PullRequest
1 голос
/ 21 апреля 2011

У меня есть таблица SQL, которая будет объединена с двумя подтаблицами. Одна из этих подтаблиц является простым соединением, но другая будет иметь одну или несколько записей, которые соответствуют одной из записей в родительской таблице. Мне нужно написать запрос, который будет возвращать каждую запись в родительской таблице и только самую последнюю запись для каждой соответствующей записи в родительской таблице.

Так, например:

Родительская таблица

ParentID
ParentName
Идентификатор_пользователя
ParentBlahBlah

SubTable1

Идентификатор_пользователь
UserName
UserGroup
UserCreated

SubTable2

SubID
ParentID
Подимени
SubBlahBlah

Мой запрос в таком виде выглядит примерно так:

SELECT * FROM ParentTable
  INNER JOIN SubTable1
    ON ParentTable.UserID=SubTable1.UserID
  INNER JOIN 
    (SELECT TOP 1 * FROM SubTable2) as Table2
    ON ParentTable.ParentID = Table2.ParentID

Вот где я застрял. TOP явно не прав, поскольку он выбирает только одну строку, а не одну строку для каждого ParentID.

Я хотя бы на правильном пути?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Попробуйте это:

WITH DAT AS
(
SELECT *,
    RANK() OVER(PARTITION BY ParentTable.ParentID ORDER BY ParentID DESC) RN
  FROM ParentTable INNER JOIN SubTable1
    ON ParentTable.UserID = SubTable1.UserID INNER JOIN SubTable2
    ON ParentTable.ParentID = SubTable2.ParentID
)
SELECT *
  FROM DAT
 WHERE RN = 1
2 голосов
/ 21 апреля 2011

Одним из способов является использование CROSS APPLY

SELECT *
FROM   ParentTable
       INNER JOIN SubTable1
         ON ParentTable.UserID = SubTable1.UserID
       CROSS APPLY (SELECT TOP 1 *
                    FROM   SubTable2
                    WHERE  ParentTable.ParentID = SubTable2.ParentID
                    ORDER  BY [date] DESC) ca  
0 голосов
/ 21 апреля 2011

во втором вашем внутреннем соединении вместо

(SELECT TOP 1 * FROM SubTable2)

использование

(Select * from SubTable2 WHERE
 SubId in (SELECT MAX(SubId) FROM SubTable2 GROUP BY ParentID))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...