SQL Serverには APPLY と言う結合方法があります。簡単に言うとサブクエリの()の外側の値が参照出来ます。
はい、うまく説明出来ませんので実際にクエリを書いてみます。
--テーブル1作成 CREATE TABLE [dbo].[T1]( [ID] INT , [NAME] NVARCHAR(20) , ) -- テーブル1データ登録 insert into T1 select 1,N'荒川太郎'; insert into T1 select 2,N'荒川次郎'; insert into T1 select 3,N'佐藤花子'; --テーブル2作成 CREATE TABLE [dbo].[T2]( [ID] INT, [AGE] INT, ) -- テーブル2登録 insert into T2 select 1,18; insert into T2 select 3,17;
サブクエリを使ったうえで結合させます。
--サブクエリでエラー発生 select * from T1 INNER JOIN (SELECT * FROM T2 WHERE T1.ID = T2.ID) T2
マルチパート識別子をバインドできませんでしたみたいなエラーになります。これは、サブクエリ内の()の中から参照できない値がありますっということです。
これをエラーが発生しないように書くと
select * from T1 INNER JOIN (SELECT * FROM T2) T2 ON T1.ID = T2.ID
サブクエリの外でないとテーブルT1が参照出来ないわけです。
なんとなく伝わりますかね?
この参照できない問題がAPPLY句を使うとサブクエリ()の外側の テーブル:T1 の値が参照出来るようになります。
select * from T1 CROSS APPLY (SELECT * FROM T2 WHERE T1.ID = T2.ID) T2
--APPLY 不使用 select * from T1 INNER JOIN (SELECT * FROM T2) T2 ON T1.ID = T2.ID --APPLY 使用 select * from T1 CROSS APPLY (SELECT * FROM T2 WHERE T1.ID = T2.ID) T2
ふたつのクエリは同じ結果が得られます。
簡単なクエリで説明してるので、APPLYオペレータを使う理由がわかりにくいかもしれませんが、複雑なサブクエリを含むクエリを書くさいに使用するとスッキリ書けたりします。
ちなみに読み方は「アプライ」と読み、英語で適用する、用いると言った意味です。
コメント