1. ホーム
  2. sql

[解決済み] SQLでOUTER/CROSS APPLYを使用する場合の実際の例

2022-03-09 02:54:49

質問

を見てきました。 CROSS / OUTER APPLY 同僚と一緒に、どこで使うかの実例を見つけるのに苦労しています。

を見るのにかなりの時間を費やしました。 Inner JoinよりもCross Applyを使用すべきなのはどのような場合ですか? とググってみましたが、主な(唯一の)例はかなり奇妙なようです(あるテーブルの行数を使用して、別のテーブルから何行を選択するかを決定する)。

このシナリオには OUTER APPLY :

連絡先テーブル(各連絡先につき1レコードを含む) 通信項目テーブル(各連絡先の電話番号、FAX番号、Eメールを含むことができる)

しかし、サブクエリ、一般的なテーブル表現を使用します。 OUTER JOINRANK()OUTER APPLY はすべて同じように動作するようです。このことは、このシナリオが APPLY .

実際の事例を紹介して、機能の説明に役立ててください

どのように解決するのですか?

のいくつかの用途は APPLY は...

1) グループごとの上位N個のクエリ (カーディナリティによってはより効率的です)

SELECT pr.name,
       pa.name
FROM   sys.procedures pr
       OUTER APPLY (SELECT TOP 2 *
                    FROM   sys.parameters pa
                    WHERE  pa.object_id = pr.object_id
                    ORDER  BY pr.name) pa
ORDER  BY pr.name,
          pa.name 

2) 外側のクエリの各行に対してテーブル値付き関数を呼び出す

SELECT *
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)

3) カラムエイリアスの再利用

SELECT number,
       doubled_number,
       doubled_number_plus_one
FROM master..spt_values
CROSS APPLY (SELECT 2 * CAST(number AS BIGINT)) CA1(doubled_number)  
CROSS APPLY (SELECT doubled_number + 1) CA2(doubled_number_plus_one)  

4) 複数の列のグループをアンピボットする

1NFに違反するテーブル構造を想定して......。

CREATE TABLE T
  (
     Id   INT PRIMARY KEY,

     Foo1 INT, Foo2 INT, Foo3 INT,
     Bar1 INT, Bar2 INT, Bar3 INT
  ); 

2008+を使用した例 VALUES の構文があります。

SELECT Id,
       Foo,
       Bar
FROM   T
       CROSS APPLY (VALUES(Foo1, Bar1),
                          (Foo2, Bar2),
                          (Foo3, Bar3)) V(Foo, Bar); 

2005年 UNION ALL を使用することができます。

SELECT Id,
       Foo,
       Bar
FROM   T
       CROSS APPLY (SELECT Foo1, Bar1 
                    UNION ALL
                    SELECT Foo2, Bar2 
                    UNION ALL
                    SELECT Foo3, Bar3) V(Foo, Bar);