問題タブ [cross-apply]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
15 に答える
839902 参照

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

CROSS APPLYを使用する主な目的は何ですか?

cross applyパーティションを作成している場合に大きなデータセットを選択するときに、より効率的になる可能性があることを(漠然と、インターネット上の投稿を通じて)読んだことがあります。(ページングが頭に浮かぶ)

CROSS APPLYまた、右のテーブルとしてUDFを必要としないことも知っています。

ほとんどのINNER JOINクエリ(1対多の関係)では、使用するように書き直すことができますCROSS APPLYが、常に同等の実行プランが得られます。

誰かが私に、CROSS APPLYそれがうまくいく場合にいつ違いを生むかについての良い例を教えてもらえINNER JOINますか?


編集:

これは簡単な例で、実行プランはまったく同じです。(それらが異なり、どこcross applyがより速く/より効率的であるかを見せてください)

0 投票する
2 に答える
888 参照

sql - クレイジーな SQL の質問: ピボットを使用してある種のクロス適用を行うにはどうすればよいですか?

顧客は、フィールドに大量のレコードがあるデータにショートカットを持っています。それらを解析するとき、「識別子」を 7 日ずつ増やして、数量ごとに 1 つのレコードを作成する必要があります (数字は日付を表しているためです。

例: 4 週間販売されている単一の製品で、4 つのレコードが必要です。毎週 1 つの製品。

 [Event Number]   [Classification]   [Weeks Running]    [Some Data]  
 2009 11 29 00           1                   1         runs one week 
 2009 12 06 00           2                   1         runs one week 
 2009 12 13 00           1                   4        runs four weeks
 2009 12 20 00           2                   4        runs four weeks

どういうわけか、このデータをビュー(sql select)で次のように変換する必要があります(すべて同じテーブル内にあり、パーツを表示するために空白が含まれています:

 [Event Number + Classification]      [Some Data]    
          2009 11 29 01            runs for one week 1週間で1レコード。
          2009 12 06 02            runs for one week 

          2009 12 13 01           runs for four weeks日付を 7 ずつ
          2009 12 20 01           runs for four weeks
          2009 12 27 01           runs for four weeks
          2009 01 03 01           runs for four weeks

          2009 12 20 02           runs for four weeks増やして 4 回繰り返す 日付を 7 ずつ増やして 4 回繰り返す
          2009 12 27 02           runs for four weeks
          2009 01 03 02           runs for four weeks
          2009 01 10 02           runs for four weeks

私の考えは、ある種のピボットクロス適用SQLコードを持っていることですか?

0 投票する
2 に答える
5554 参照

.net - LINQtoSQLクロスアプライ

LINQのユーザー定義テーブル値関数にクロスアプライするクエリを作成したいと思います。SQLは、以下のように非常に単純です。

この投稿では、クロスアプライと外部アプライの両方を含むが、tvfではなくサブクエリのみを含むSQLが生成されるLINQクエリの例を示します。 この記事では、LINQ to SQLが「関係ナビゲーション」の相互適用演算子と外部適用演算子を生成することを確認していますが、このコンテキストでそれが何を意味するのかはわかりません。 これ投稿では、私がやりたいことのほとんどを説明しています。答えは、これを行う唯一の方法は、SQLクエリをストアドプロシージャでラップしてから、LINQを介してspを呼び出すことです。アプリケーション全体で複数のLINQクエリでこのように使用できるtvfが実際に必要なので、これが当てはまらないことを願っています。そのため、「spでラップする」は機能しません。LINQを介して上記の単純なSQLステートメントのようなものを取得する方法を知っている人はいますか?

0 投票する
1 に答える
840 参照

sql-server-2005 - フリーテキストをクロスアプライ

MS SQL Server 2005:table1にはフルテキストインデックスがあります。1回のクエリで複数のフリーテキストテーブル検索を実行したいのですが、2回の試行が失敗しました。助けていただければ幸いです、ありがとう!これが修正されれば、psはsql2008にアップグレードする用意があります:)

0 投票する
2 に答える
5404 参照

sql-server - CROSS APPLY to INNER JOINを書き直して、ビューのインデックスを作成する方法

別のスレッドで、ストアドプロシージャをビューに変換する方法の実例を取得しました。これは、顧客名を注文マッピングに保持します。注文は、注文がない場合のNULLを含む、注文のコンマ区切りリストです。したがって、以下の表の場合、ビューに表示するには次のものが必要です。

ビューにインデックスを付ける必要がありますが、ビュー内のSELECTクエリにAPPLYやサブクエリがある場合はインデックスを付けることができません。このビューをインデックス付きビューに変換することは可能ですか?

0 投票する
1 に答える
315 参照

sql-server - SQL Server の XML 列内のデータにアクセスするための推奨される方法

バックグラウンド

最近、私は SQL Server 2005 の列として XML をより多く使用するようになりました。いくつかの結合をサポートする構造コードをさらに記述します。

SCOPE_IDENTITY()これら 2 つのリンク テーブルのデータを実際に生成するために、2 つの XML フィールドをストアド プロシージャに渡します。ストアド プロシージャは、メイン レコードを書き込み、2 つの XML 変数を @tables に分解し、マスターからの新しい変数とともに実際のテーブルに挿入します。記録。

しばらくして、これらのテーブルを完全に廃止し、XML を XML フィールドに格納することにしました。ここで、一般的なクエリのパフォーマンスGROUP BYが XML データでは機能しないなど、いくつかの落とし穴があることを理解しました。クエリは一般的に少しごちゃごちゃしていますが、全体的にはXElement、データが戻ってきたときに作業できるようになったことが気に入っています。

また、この内容は変更されません。ワンショットなので改造の心配はありません。

このデータを実際に取得するための最良の方法について疑問に思っています。私のクエリの多くは、子レコードまたはサブ子レコードの条件に基づいてマスター レコードを取得することを伴います。データベース内のほとんどの sproc はこれを行いますが、はるかに精巧な規模であり、通常は UDF とサブクエリが効果的に機能する必要がありますが、いくつかのデータのクエリをテストするために簡単な例を作成しました...

今、私はそれをつかむ2つの方法を見ることができます.

方法 1

本当に?sql:variable は少し不健全に感じます。ただし、機能します。ただし、より意味のある方法でデータにアクセスすることは明らかに困難です。

方法 2

これはもっと似ています。すでに簡単に拡張して、結合やその他すべての優れた機能を実行できます。CROSS APPLY以前にテーブル値関数で使用したことがありますが、非常に優れていました。前のクエリとは対照的に、この実行計画は非常に高度です。確かに、私はこれらのテーブルに対してインデックス作成などを行っていませんが、バッチ コスト全体の 97% を占めています。

方法 2 (拡張)

ここにいいIN節があります。次のようなこともできますpt.PhoneType = 'Work'

ついに

したがって、基本的には必要な結果を取得していますが、このメカニズムを使用して少量の XML データを調査する場合に注意すべきことはありますか? 精巧な検索中にパフォーマンスが低下しますか? また、そのようなマークアップ スタイル データの保存はオーバーヘッドが大きすぎますか?

サイドノート

私は過去にリストをsprocに渡すためだけにsp_xml_preparedocumentOPENXMLのようなものを使用しましたが、これは比較して新鮮な空気のようなものです!

0 投票する
1 に答える
345 参照

sql - SQL複合ユニオン

これを説明するのは少し難しいですが、うまくいけば解決策があります。

IDを取得してテーブルを返すUDFがあります。SELECTこれらのIDに対してUNION、UDFの結果を実行する方法はありますか?例えば;

IDを取得するには;

SELECT [ID] FROM [TableOfIDs]

IDからオブジェクトのプロパティを取得するには;

SELECT * FROM GetObjectProperties(@ID)

しかし、どうすれば2つを組み合わせることができますか?つまり、IDのクエリからUDFの結果を結合するにはどうすればよいですか?

それが理にかなっていることを願っています!

0 投票する
2 に答える
39953 参照

xml - XMLフィールドのノード数を取得するXQuerySQLServer 2008

XMLフィールドのノード数を取得しようとしています。しかし、結果として常に0が表示されます。これが私のクエリがどのように見えるかです。

私のXMLは次のようになります:

0 投票する
1 に答える
4474 参照

sql-server-2008 - SQLサーバーでクロス適用

最近、ストアド プロシージャに問題があり、動作が遅すぎたため、同僚の 1 人がクロス適用を提案しました。クロス適用は内部結合として機能するが、テーブル間のコマンド キーは必要ないと言いました。

私のシナリオは、私は3つのテーブルを持ってcrossarticle_articleおりcrossarticle_articletocategory、今は4であるcrossarticle_article すべてのレコードを取得したいと思っています。categoryidcategoryidcrossarticle_articletocategory

私が理解している限り、以下のクエリを作成しました:

このクエリはcrossarticle_article、カテゴリ ID が 1 に一致するレコードのみを返す必要がありますが、3 つのテーブルすべてからすべてのレコードを返します。

私が間違っているところ、これがクロス適用の使用方法でない場合、使用方法、およびその利点は何ですか。

クロス適用が同じテーブルで機能するということですか...もしそうなら、シナリオはどうなるでしょうか...

0 投票する
0 に答える
251 参照

sql - クエリを最適化する方法

Linq2SqlをORMとして使用していて、次の問題が発生しています。2つのテーブルがあり、それらをclient(id、name)およびclient_action(id、clientid、date)と呼びます。'client'テーブルにはクライアントが含まれ、client_actionにはユーザーのアクションのログが含まれ、最初に必要なものがあります。

linq2sqlクエリ(ページングと並べ替えを使用)があり、その結果、次のSQLが生成されました。

そのクエリに論理エラーがあり、私はそれを変更しました。これで、生成されたSQLは次のようになります。

そして、パフォーマンスの問題が発生します。'SET STATISTICS IO ON'を使用して両方のクエリを実行したところ、興味深い結果が得られました。

  • 最初のクエリの場合:
    • クライアントテーブルはフィルタリングされます
    • 「トップ10」が適用されました
    • 結果の10レコードに「クロスアプライ」が適用されます
  • 2番目のクエリの場合:
    • クライアントテーブルがフィルタリングされます(約10,000レコードが見つかりました)
    • その10Kレコードに適用される「クロスアプライ」
    • 「トップ10」が適用されました

そのため、2番目のクエリの動作が大幅に遅くなります。可能な場合はいつでもフィルタリング後に「クロスアプライ」が適用されるようにクエリを「微調整」する方法はありますか?

問題は、2つのクロスアプライがあり、そこにさらに2つの結合があり、すべてが非常に遅くなることです。クエリの速度を向上させることができるインデックスを作成しましたが、それでも煩わしいほど遅いです。

ヘルプヘルプ ヘルプ