Выберите внутреннее соединение "многие к одному", ограничивающее число результатов для дочерней таблицы. - PullRequest
2 голосов
/ 19 марта 2012

У меня есть следующие таблицы:

create table TableA (
    Id int primary key identity,
    Name varchar(80) not null
)

create table TableB (
    Id int primary key identity,
    TableA_Id int not null foreign key references TableA(Id),
    Value varchar(80) not null
)

Я хотел бы написать запрос, похожий на

select TableA.Name, TableB.Value
    from TableA
    inner join TableB on TableA.Id = TableB.TableA_Id
    where TableA.Name like 'a%'
    order by TableB.Value asc

за исключением того, что мне нужны только первые 10 в каждом TableA_Id из TableB.Value (по возрастанию TableB.Value).

Вместо того, чтобы возвращать каждый TableB.Value каждого TableA.Name, мне нужны только первые 10 значений каждого TableA.Name.

Что бы был такой запрос?

1 Ответ

5 голосов
/ 19 марта 2012

Используйте CROSS APPLY.

A CROSS APPLY позволяет вам

  • Использовать TOP в подвыборке
  • Использовать ORDER BY в подвыборке
  • Сопоставьте каждую строку внешнего выбора с каждой соответствующей строкой из подвыбора

Оператор SQL

SELECT  TableA.Name
        , b.Value
FROM    TableA
        CROSS APPLY (
          SELECT  TOP 10 *
          FROM    TableB
          WHERE   TableA.Id = TableB.TableA_Id
          ORDER BY
                  TableB.Value
        ) b
WHERE   TableA.Name LIKE 'a%'        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...