愚者の経験

「また今度」はほとんどこない

[SQL Server]apply句を使わないなんてとんでもない

久しぶりの投稿。今回はSQL Serverの一つの機能についてご紹介。

「apply句」というものです。

DBの種類によってはLATERAL句とか言われるらしいですね。

select A.ID,X.col1,X.col2
from dbo.table1 as A
    outer apply (
        select top 1 B.col1,B.col2
        from dbo.table2 as B
        where B.ID=A.ID
        order by B.inputdate desc
    ) as X
where A.datatype=1
order by A.ID

こんな感じで記述、実行できます。LATERALは遅延実行みたいな意味なのかな?
例えばデータに対する履歴テーブルみたいなものを取っており、
「最新の1履歴だけデータごとに出す」という内容のselectをする場合に
とても有用。副問合せでは1列しか選択できないのを
複数列で対応できるようになった感じ、と言ったほうがいいかもしれません。
副問合せではこんな感じになるんですよね。

select A.ID
    ,(
        select top 1 B.col1--,B.col2
        from dbo.table2 as B
        where B.ID=A.ID
        order by B.inputdate desc
    ) as col1
from dbo.table1 as A
where A.datatype=1
order by A.ID

これだと1列ずつしか取れず複数列をselectすると当然ですがエラーが出ます。
じゃあ複数書くのか?と言われれば心情的にはNOなわけで、今までは
row_numberで番号を付けてから1で抽出するとかして要らないデータを
検索せざるを得ない状況でした。

とはいうもののapply句はバージョン2005で実装されてるんですよね…
自分は2012年くらいから気づいたけれども正直もっと早く気づきたかった。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。