2

子テーブルのために結果の多対1の関係制限数に参加:私はそれを除いてインナー選びは、私は以下の表持つ

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 

に似たクエリを記述したいと思い

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 
) 

をそれぞれTableA_Idの中の上位10をTableB.ValueTableB.Valueの昇順)にします。

TableA.NameのすべてのTableB.Valueを返す代わりに、それぞれTableA.Nameの上位10個の値のみを入力します。

このようなクエリは何ですか?

答えて

5

CROSS APPLYを使用してください。

CROSS APPLYもし

  • 外側の各行は副選択
からすべての一致する行と選択副選択
  • マッチ中ORDER BYを使用して副選択
  • TOPを使用することができ

    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%'   
    
  • +2

    +1 - これは 'CROSS APPLY'の使用例の完璧な例です。 – Lamak

    +1

    @Lamak - 最近gbn&martinから拾ったことがあります。 –

    関連する問題