选择内部联接多对一关系,限制子表的结果数

时间:2012-03-19 14:02:50

标签: sql sql-server-2008 sql-server-2008-r2 one-to-many many-to-one

我有以下表格:

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

除了我只想要TableA_Id TableB.Value TableB.Value内的前10名(按TableB.Value升序排序)。

我不想返回每个TableA.Name的每个TableA.Name,而只想要每个{{1}}的前10个值。

这样的查询是什么?

1 个答案:

答案 0 :(得分:5)

使用CROSS APPLY

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%'