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

INNERJOINでCROSSAPPLYを使用する必要があるのはいつですか?

    INNER JOINも機能する場合に、CROSS APPLYが違いを生むときの良い例を誰かに教えてもらえますか?

    パフォーマンスの詳細な比較については、ブログの記事を参照してください:

    • INNER JOIN vs. CROSS APPLY

    CROSS APPLY 単純なJOINがないものでより効果的に機能します 状態。

    これは3を選択します t2からの最後のレコード t1のレコードごとに :

    SELECT  t1.*, t2o.*
    FROM    t1
    CROSS APPLY
            (
            SELECT  TOP 3 *
            FROM    t2
            WHERE   t2.t1_id = t1.id
            ORDER BY
                    t2.rank DESC
            ) t2o
    

    INNER JOINでは簡単に定式化できません 状態。

    CTEを使用してそのようなことを行うことができます とウィンドウ関数:

    WITH    t2o AS
            (
            SELECT  t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
            FROM    t2
            )
    SELECT  t1.*, t2o.*
    FROM    t1
    INNER JOIN
            t2o
    ON      t2o.t1_id = t1.id
            AND t2o.rn <= 3
    

    、ただし、これは読みにくく、おそらく効率が低くなります。

    更新:

    チェックしたばかりです。

    マスター20,000,000のテーブルです PRIMARY KEYのレコード idに 。

    このクエリ:

    WITH    q AS
            (
            SELECT  *, ROW_NUMBER() OVER (ORDER BY id) AS rn
            FROM    master
            ),
            t AS 
            (
            SELECT  1 AS id
            UNION ALL
            SELECT  2
            )
    SELECT  *
    FROM    t
    JOIN    q
    ON      q.rn <= t.id
    

    ほぼ30で実行されます 秒、これは:

    WITH    t AS 
            (
            SELECT  1 AS id
            UNION ALL
            SELECT  2
            )
    SELECT  *
    FROM    t
    CROSS APPLY
            (
            SELECT  TOP (t.id) m.*
            FROM    master m
            ORDER BY
                    id
            ) q
    

    瞬時です。



    1. OracleにはSQLServerのテーブル変数に相当するものがありますか?

    2. フロートの不整合の平均

    3. SQLクエリを毎日実行するようにジョブをスケジュールするにはどうすればよいですか?

    4. mysql:「文字列」を0と比較するとtrueになるのはなぜですか?