問題タブ [common-table-expression]

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 投票する
5 に答える
346 参照

tsql - T-SQL-CTEの制限によって順序を回避する方法

私は次のCTEを持っています。その目的は、一意の月/年のペアを提供することです。後のコードでは、CTEを使用して、月/年のペアの連結文字列リストを生成します。

些細なことなので、GetMonthAndYearString関数の実装は省略しました。

編集:マーティンによって要求されたように、ここに周囲のコードがあります:

悲しいことに、T-SQLは常に一歩先を行っているようです。このコードを実行すると、TOP(またはFOR XMLなど)も使用しない限り、CTEでORDER BYを使用できないことが示されます。TOPを使用すると、使用できないことが示されます。 DISTINCTを使用します。はい、T-SQLにはすべての答えがあります。

誰かが私の手首を単に切るよりも速いこの問題の解決策を考えることができますか?失血による死亡は驚くほど長引く可能性があることを理解しており、期限があります。

ご協力いただきありがとうございます。

デビッド

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

sql-server - SQL の条件付き共通テーブル式 (CTE)

SQL で製品カテゴリ ツリーの階層を選択しようとしています。

私のコードは次のようになります。SortOrder パラメーターで IF または Case When を使用して、動的な並べ替え順序を実現しようとしています。

@SortOrder が 'sortorder' に等しい場合、コメント行はアクティブになります。その周りに If Else ステートメントを追加しようとしましたが、失敗しました...

手伝ってくれますか?

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

sql-server - 自己結合で参照されるSQLServerCTEが遅い

大きなテーブルから行のサブセットを返すためにCTEで開始するテーブル値UDFを作成しました。CTEにはいくつかの結合があります。内側の2つと左側の1つは、多くの行を含まない他のテーブルに結合します。CTEには、必要な行のみを返すために、日付範囲内の行を返すwhere句があります。

次に、さまざまな基準を使用して小計を作成するために、このCTEを4つの自己左結合で参照しています。

クエリは非常に複雑ですが、ここにその簡略化された疑似バージョンがあります

SQL Serverが混乱し、自己結合ごとにCTEを呼び出すように感じます。これは、実行プランを見ると確認できたようですが、それらを読むのは専門家ではないと自白しています。

SQL Serverは、CTEからのデータ取得を数回ではなく、1回だけ実行するのに十分スマートであると想定していました。

同じアプローチを試しましたが、CTEを使用してデータのサブセットを取得するのではなく、CTEと同じselectクエリを使用しましたが、代わりに一時テーブルに出力しました。

CTEバージョンを参照するバージョンは40秒かかります。一時テーブルを参照するバージョンには、1〜2秒かかります。

SQL ServerがCTEの結果をメモリに保持するのに十分スマートでないのはなぜですか?

特にこの場合、UDFはテーブル値であるため、CTEが好きです。そのため、すべてを1つのステートメントにまとめることができました。

一時テーブルを使用するには、UDF値のマルチステートメントテーブルを作成する必要がありますが、これは少し洗練されていないソリューションです。

CTEでこの種のパフォーマンスの問題が発生した方もいらっしゃいましたか?もしそうなら、どのようにしてそれらを分類しましたか?

ありがとう、

カルロス

0 投票する
3 に答える
1031 参照

sql-server - SQLServerマルチステートメントUDF-一時的に必要なデータを保存する方法

かなり大きなテーブルで機能するいくつかの自己結合を使用した、比較的複雑なクエリがあります。したがって、そのクエリをより高速に実行するには、データのサブセットのみを操作する必要があります。上記のデータのサブセットは、渡されたパラメータに応じて12000〜120000行の範囲になります。

詳細については、こちらをご覧ください:自己結合で参照されるSQLServerCTEの速度が遅い

ご覧のとおり、以前はCTEを使用してデータサブセットを返していました。これにより、SQL Serverが1回実行してデータセットを再利用するのではなく、結合ごとにCTEでSelectステートメントを再実行するため、パフォーマンスの問題が発生しました。

別の方法として、一時テーブルを使用すると、はるかに高速に機能しました(UDF本体の外部にある別のウィンドウでクエリをテストしている間)。ただし、これをマルチステートメントUDFに実装しようとすると、SQL Serverから、マルチステートメントUDFが何らかの理由で一時テーブルをサポートしていないことを強く思い出しました...

UDFはテーブル変数を許可するので、それを試しましたが、CTEバージョンでは40秒しかかからなかったのに対し、クエリが完了するまでに1分40秒かかるため、パフォーマンスは非常にひどいものです。このスレッドにリストされている理由により、テーブル変数が遅いと思います。SQLServerストアドプロシージャへの挿入時にテーブル変数のパフォーマンスが低下する

一時テーブルのバージョンは約1秒かかりますが、SQL Serverの制限により関数にできず、テーブルを呼び出し元に戻す必要があります。

CTEとテーブル変数の両方が遅すぎて、一時テーブルがUDFで拒否されることを考えると、UDFを迅速に実行するためのオプションは何ですか?

よろしくお願いします。

0 投票する
3 に答える
6057 参照

sql - CTE を使用して列の値を文字列に連結することは可能ですか?

次のテーブルがあるとします。

再帰 CTE を使用して次の出力を生成することは可能ですか?

私はそれを少しいじりましたが、それを機能させることができませんでした。別のテクニックを使った方が良いでしょうか?

0 投票する
3 に答える
4115 参照

sql - SQL Server2008CTE再帰

CTEを使用して難しい再帰であると私が信じていることを実行しようとしています。SQLServer2008です。これに頭を悩ませているようには見えません。

以下の例では、3の固定深度を想定できます...それよりも低くなることはありません。実生活では、深さは「より深い」ですが、それでも固定されています。例では、それをいくつか単純化しようとしました。

私の入力データは以下のようなものです。

私のCTEの出力は次の表になります。

出力でID列を取得できれば、ルックアップテーブルの名前に確実にマップできます。

私は、SSISの使用を含め、これを達成する他の方法にもオープンです。

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

sql - SQL Server は Oracle のような WITH 句をサポートしていますか?

次のようにサブクエリをエイリアシングするために、ここで数回 Oracle の WITH 句について言及しているのを見てきました。

これをサポートしている SQL Server のバージョンはありますか? そうでない場合、そうしない特別な理由はありますか? パフォーマンス?誤った使用の可能性はありますか?

0 投票する
3 に答える
1459 参照

sql - SQL 共通テーブル式の列の中央値を計算します

MSSQL2008 では、次のように従来の中央値クエリを使用して、共通テーブル式から数値列の中央値を計算しようとしています。

私が得る結果セットは次のとおりです。

つまり、「中央値」列は、中央値列が「x1」であると予想される場合、「数値」列と同じです。同様の式を使用してモードを計算すると、同じ共通テーブル式に対して正常に機能します。

0 投票する
3 に答える
5566 参照

sqlite - SQLiteの一般的なテーブル式機能

2つの連続する集計関数をデータセット(一連の平均の合計)に適用する必要があります。これは、SQLServerまたはCTEをサポートする別のDBMSの一般的なテーブル式で簡単かつ日常的に実行できます。残念ながら、私は現在、CTEをサポートしていないSQLiteで立ち往生しています。2つのクエリを実行して結果をコードにロールアップせずにSQLiteで同じ結果を達成するための代替または回避策はありますか?

さらにいくつかの詳細を追加すると、いくつかのパラメーターを持つWHERE句に基づいて集計値の最初のセットを取得する必要があるため、ビューで簡単に実行できるとは思いません。例えば、

そして、それらの平均の合計が必要です。

0 投票する
4 に答える
4589 参照

sql-server - ORDER BY CASE 使用時の Row_Number() CTE パフォーマンス

ページングと順序付けを行いたいテーブルがあり、次のようなクエリを取得して作業を行うことができました (実際のクエリは、結合などにはるかに関与しています)。

ORDER BY Date desc問題は、CASE ステートメントを使用すると、通常の句と比較してパフォーマンスが大幅に低下することです (少なくとも 10 倍の速度低下) 。クエリ プランを見ると、@sortCol 修飾子と一致しない場合でも、すべての列がまだ並べ替えられているように見えます。

これを「ネイティブ」に近い速度で実行する方法はありますか? 動的 SQL はこの問題の最良の候補ですか? ありがとう!