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

cm0*_*007 2 sql one-to-many many-to-one sql-server-2008 sql-server-2008-r2

我有以下表格:

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
)
Run Code Online (Sandbox Code Playgroud)

我想写一个类似的查询

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
Run Code Online (Sandbox Code Playgroud)

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

而不是每个TableB.Value都返回TableA.Name,我只想要每个的前10个值TableA.Name.

这样的查询会是什么?

Lie*_*ers 5

用一个CROSS APPLY.

A CROSS APPLY允许你

  • TOP在子选择中使用a
  • ORDER BY在子选择中使用an
  • 将外部选择的每一行与子选择中的每个匹配行匹配

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%'        
Run Code Online (Sandbox Code Playgroud)

  • +1 - 这是使用"交叉应用"的完美示例 (2认同)