タグ付けされた質問 「cte」

共通テーブル式の頭字語。再帰的である可能性がある一時的な再利用可能なサブクエリ。

3
WITH CTEとWITH CTE(<column_names>)の違いは何ですか?
MSDNの共通テーブル式の使用に示すように、CTEを次のように定義できます。 WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition ) そしてそれを次のように使用します: SELECT &lt;column_list&gt; FROM expression_name; 次の2つのCTEがあるとします with cte1 as( select name from Table1 ) with cte2(name) as( select name from Table1 ) クエリは、内部クエリが同じであるため、両方のCTEに対して同じ結果を出力します。これら2つの違いは、cte2の(name)宣言で列名()が定義されていることだけです。 両方のCTEを実行しても、実行計画に違いはありません。 私は知りたいだけです: CTE定義で列名を指定しない場合、どのような違いがありますか? CTEの作成時に列名を指定する必要がある/すべきではないのはなぜですか? 万が一クエリ実行プランに影響はありますか?(私が見た限りでは、何の違いもありません。)

1
SQL ServerがCTEを「最適化フェンス」として使用する場合に決定するルールは何ですか?
しばらく前に、Brent OzarがSQL ServerとPostgreSQLの違いのいくつかを詳しく説明した投稿を公開しました: SQL ServerとPostgreSQLの2つの重要な違い 最初のポイント(「CTEは最適化フェンス」)が私の目を引きました。提供されている例では、SQL ServerがCTEとメインクエリを組み合わせ、それを単一のクエリとして最適化している( PostgreSQL)。 ただし、この動作は、SQL ServerがCTEを最適化フェンスとして扱う他のブログやトレーニングクラスで見た例とは逆のようです。これにより、インデックスの使用やパフォーマンスの向上などが可能になります。次に例を示します。 星を選択するより良い方法 したがって、SQL ServerはCTEを最適化のフェンスとして「称賛」しているようです。SQL ServerがCTEを最適化フェンスとして確実に尊重する既知のケース(またはその逆の動作)の特定のリストを文書化する優れたリソースはありますか?

1
再帰CTEのカーディナリティを「ヒント」にするにはどうすればよいですか?
最小限の例として次の再帰CTEを使用していますが、一般的に、オプティマイザは再帰CTEにデフォルトの「推測」カーディナリティを使用する必要があります。 with recursive w(n) as ( select 1 union all select n+1 from w where n&lt;5 ) select * from w; /* n --- 1 2 3 4 5 */ explain analyze with recursive w(n) as ( select 1 union all select n+1 from w where n&lt;5 ) select * …

5
インラインビューとWITH句の違いは何ですか?
インラインビューを使用すると、サブクエリから別のテーブルのように選択できます。 SELECT * FROM /* Selecting from a query instead of table */ ( SELECT c1 FROM t1 WHERE c1 &gt; 0 ) a WHERE a.c1 &lt; 50; これは、インラインビュー、WITH句、CTE、派生テーブルなど、さまざまな用語を使用して言及されているのを見てきました。私には、同じものに対して異なるベンダー固有の構文があるようです。 これは間違った仮定ですか?これらの間に技術/パフォーマンスの違いはありますか?

2
パラメータ付きのこの再帰的CTEがリテラルで行うとき、なぜインデックスを使用しないのですか?
ツリー構造で再帰CTEを使用して、ツリー内の特定のノードのすべての子孫をリストしています。WHERE句にリテラルノード値を書き込むと、SQL Serverは実際にその値にのみCTEを適用し、実際の行数が少ないクエリプランなどを提供します。 ただし、値をパラメーターとして渡すと、CTEが実現(スプール)され、事実の後でフィルター処理されるようです。 私は計画を間違って読んでいた可能性があります。パフォーマンスの問題には気づきませんでしたが、CTEの実現により、特にビジーなシステムでは、より大きなデータセットで問題が発生する可能性があると心配しています。また、私は通常、このトラバーサルをそれ自体で複合します。祖先までトラバースし、子孫まで戻ります(すべての関連ノードを確実に収集するため)。私のデータが原因で、「関連」ノードの各セットはかなり小さいため、CTEの実現は意味がありません。また、SQL ServerがCTEを実現しているように見える場合、その「実際の」数には非常に多くの数値が含まれています。 クエリのパラメーター化されたバージョンをリテラルバージョンのように機能させる方法はありますか?CTEを再利用可能なビューにしたいと考えています。 リテラルを使用したクエリ: CREATE PROCEDURE #c AS BEGIN; WITH descendants AS (SELECT t.ParentId Id ,t.Id DescendantId FROM #tree t WHERE t.ParentId IS NOT NULL UNION ALL SELECT d.Id ,t.Id DescendantId FROM descendants d JOIN #tree t ON d.DescendantId = t.ParentId) SELECT d.* FROM descendants d WHERE …

1
以下のクエリから階層値を取得するにはどうすればよいですか?
という名前Categoryの列を持つテーブルという名前のテーブルがありますCategoryID。と呼ばれる同じテーブルに参照列がありますfParentCategoryID。 すべてのカテゴリIDとそのサブカテゴリIDをカンマで区切る必要があります。例 -10の親カテゴリIDが1で、20の親カテゴリIDが10の場合、カテゴリID 20を印刷するとき、1と10の両方を親としてカンマ区切り値で印刷する必要があります。 以下のクエリを試してみましたがNULL、ParChild列が表示されます。助けてください。 ;WITH cteReports AS ( SELECT c.CategoryID, c.fParentCategoryID, [level] = 1, ParChild=cast(CAST(c.fParentCategoryID AS VARCHAR(200)) + ',' + CAST(c.CategoryID AS VARCHAR(200)) AS VARCHAR(MAX)) FROM retail.Category c WHERE c.fParentCategoryID is NULL UNION ALL SELECT c.CategoryID, c.fParentCategoryID, [level] + 1, ParChild = ParChild + ',' + CAST(c.CategoryID AS VARCHAR(200)) …

3
IF EXISTSクエリでのCTEの使用
SQL Server 2012で次のようなことを行うことはできますか? IF EXISTS ( WITH DATA AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY column ORDER BY Column) AS rn FROM table ) SELECT * FROM DATA WHERE rn = 2 ) BEGIN ... END この構文を使用しようとすると、エラーが発生しました。これが不可能な場合、一時テーブルを使用することがこれを達成するための最良の方法でしょうか?
8 sql-server  cte 

3
値のいずれかがサブクエリ結果にあるかどうかを確認します
注文IDのリストを返す複雑なサブクエリがあります。これらの注文がある顧客のリストを取得する必要があります。問題は、顧客を注文に割り当てる方法が2つあることです(2つのフィールドのうちの1つ)。私はこのようなことをすることができます: select * from Customers where orderId in (select...) or secondaryOrderId in (select ...) 問題は、サブクエリが実行にかかる時間と画面スペースの両方で非常に大きいことです。いずれかのフィールドに目的の結果が含まれているかどうかを確認する方法はありますか?

1
CTEが失われた更新を受け入れるのはなぜですか?
クレイグリンガーがコメントしたときの意味がわかりません。 挿入トランザクションがロールバックすると、このソリューションは更新が失われる可能性があります。UPDATEが行に影響を与えたことを確認するチェックはありません。 上https://stackoverflow.com/a/8702291/14731。失われた更新がどのように発生するかを示すイベントのサンプルシーケンスを提供してください(例:スレッド1がX、スレッド2がY)。

1
再帰的なCTEパフォーマンス
再帰的なCTEパフォーマンスのヘルプが必要です。CTE以下では、階層データを再帰的にプルしようとしているため、実行速度が非常に遅くなっています。テーブルは大きく、すべてのルートIDに最大3つの再帰的なアイテムIDがあります。約200000以上のルートIDが存在する可能性があります。アンカーのすべてのrootidは再帰的にitemidになるため、再帰的なCTEは巨大なデータセットでは遅いことを知っています。 スキーマ: Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime) 上記の表には100万行を超える行があります。 CTEクエリ: ; With rootcte as ( select itemid from RootItem where rootid is null union all select r.itemid as RootId , i.itemid from RootItem i join rootcte r on i.rootid = r.itemid ) テーブルスキーマを変更してheirarchyidを使用することはできません。whileループも試しましたが、それも遅いです。 このクエリを最適化できる他の方法はありますか? …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.