sql >> データベース >  >> RDS >> Sqlserver

実際の例、SQLでOUTER /CROSSAPPLYを使用する場合

    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);
    


    1. WHEREIN句のパラメータをPDOにバインドする

    2. MariaDBでのFIND_IN_SET()のしくみ

    3. 警告:mysql_fetch_array()は、パラメーター1がリソースであると想定しています。ブール値は次のように指定されます。

    4. SQLServerのID列の増分値を返します