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

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

7
CTEと一時テーブルの違いは何ですか?
共通テーブル式(CTE)と一時テーブルの違いは何ですか?そして、いつ一方を使用する必要がありますか? CTE WITH cte (Column1, Column2, Column3) AS ( SELECT Column1, Column2, Column3 FROM SomeTable ) SELECT * FROM cte 一時テーブル SELECT Column1, Column2, Column3 INTO #tmpTable FROM SomeTable SELECT * FROM #tmpTable
174 sql-server  cte 


3
Common Table Expression(CTE)の利点は?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 msdnから: 派生テーブルとは異なり、CTEは自己参照することができ、同じクエリで複数回参照できます。 私はCTEをかなり頻繁に使用していますが、CTEを使用する利点について深く考えたことはありません。 同じクエリでCTEを複数回参照する場合: パフォーマンス上の利点はありますか? 自己結合を実行している場合、SQL Serverはターゲットテーブルを2回スキャンしますか?
21 sql-server  cte 

4
SQL再帰は実際にどのように機能しますか?
他のプログラミング言語からSQLに移行すると、再帰クエリの構造はかなり奇妙に見えます。一歩ずつ歩いていくと、バラバラになっているようです。 次の簡単な例を考えてみましょう。 CREATE TABLE #NUMS (N BIGINT); INSERT INTO #NUMS VALUES (3), (5), (7); WITH R AS ( SELECT N FROM #NUMS UNION ALL SELECT N*N AS N FROM R WHERE N*N < 10000000 ) SELECT N FROM R ORDER BY N; それを見てみましょう。 最初に、アンカーメンバーが実行され、結果セットがRに格納されます。したがって、Rは{3、5、7}に初期化されます。 次に、実行はUNION ALLを下回り、再帰メンバーが初めて実行されます。Rで実行されます(つまり、現在手元にあるRで実行されます:{3、5、7})。この結果は{9、25、49}になります。 この新しい結果はどうなりますか?既存の{3、5、7}に{9、25、49}を追加し、結果のユニオンRにラベルを付け、そこから再帰を続行しますか?または、Rをこの新しい結果{9、25、49}のみに再定義し、後ですべての結合を行いますか? どちらの選択も意味がありません。 Rが{3、5、7、9、25、49}であり、再帰の次の反復を実行すると、{9、25、49、81、625、2401}になり、 {3、5、7}を失った。 ...

5
CTE結果をキャッシュ(遅延スプール)するためのプランガイドを作成する
私は通常、最初に正しいプランを使用するクエリを作成し、それを使用しない同様のクエリにコピーすることにより、プランガイドを作成します。ただし、特にクエリが完全に同じではない場合は、注意が必要です。ゼロから計画ガイドを作成する正しい方法は何ですか? SQLKiwiはSSISで計画を作成することについて言及しましたが、SQL Serverの適切な計画のレイアウトを支援する方法または有用なツールはありますか? 問題の特定のインスタンスは、このCTEです:SQLFiddle with cte(guid,other) as ( select newid(),1 union all select newid(),2 union all select newid(),3) select a.guid, a.other, b.guid guidb, b.other otherb from cte a cross join cte b order by a.other, b.other; そこにあるいかなる結果が正確に3つの異なる思い付くようにする方法guidsおよびこれ以上は?いくつかのSQL Server CTEの癖を克服するために複数回参照されるCTEタイプのクエリを含むプランガイドを含めることで、今後より良い質問に答えられることを望んでいます。
19 sql-server  t-sql  cte 

2
すべての子供の合計を見つける再帰的CTE
これは、再帰T-SQLクエリ(おそらくCTE)を使用して検索したいアセンブリツリーです。以下の結果が期待されます。任意の部品について、アセンブリごとの合計金額を知りたい。 つまり、「Rivet」を検索すると、直接の子の数だけでなく、アセンブリ内の各レベルの合計数を知りたいのです。 Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 , 1 現在、直接の親を取得できますが、CTEを拡張してこの情報を上にロールアップできるようにする方法を知りたいです。 With ...

2
WITHを使用した複数の操作
使用して複数の操作を実行する方法があるWITH文は? 何かのようなもの WITH T AS ( SELECT * FROM Tbl ) BEGIN OPEN P_OUTCURSOR FOR SELECT * FROM T; SELECT COUNT(*) INTO P_OUTCOUNT FROM T; END; データとそのカウントを選択したい...
16 oracle  select  cte 

2
PostgreSQLの再帰的な子孫の深さ
祖先の子孫の深さを計算する必要があります。レコードにがある場合、レコードはobject_id = parent_id = ancestor_idルートノード(祖先)と見なされます。WITH RECURSIVEPostgreSQL 9.4でクエリを実行しようとしています。 データや列を制御しません。データおよびテーブルスキーマは外部ソースから取得されます。テーブルは継続的に成長しています。現在、1日あたり約3万件の記録があります。ツリー内のノードは欠落している可能性があり、ある時点で外部ソースからプルされます。彼らは通常引き込まれますcreated_at DESC順番にますが、データは非同期のバックグラウンドジョブでプルされます。 最初はこの問題に対するコードソリューションがありましたが、現在は500万行以上あり、完了するまでに約30分かかります。 テーブル定義とテストデータの例: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer NOT NULL, parent_id integer, ancestor_id integer, generation integer NOT NULL DEFAULT 0 ); INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation) VALUES ...

3
CTE階層の最適化
以下を更新 アカウントの階層を表す一般的なアカウント/親アカウントアーキテクチャのアカウントのテーブルがあります(SQL Server 2012)。CTEを使用してVIEWを作成し、階層をハッシュしました。全体として、意図したとおりに美しく機能します。任意のレベルで階層を照会し、ブランチを簡単に確認できます。 階層の関数として返される必要があるビジネスロジックフィールドが1つあります。各アカウントレコードのフィールドは、ビジネスのサイズを記述します(CustomerCountと呼びます)。レポートする必要があるロジックは、ブランチ全体からCustomerCountをロールアップする必要があります。つまり、アカウントが与えられた場合、そのアカウントのcustomercount値と、階層に沿ったアカウントの下のすべてのブランチのすべての子を合計する必要があります。 acct4.acct3.acct2.acct1のように見えるCTE内に構築された階層フィールドを使用して、フィールドを正常に計算しました。私が直面している問題は、単純に高速化することです。この1つの計算フィールドがないと、クエリは約3秒で実行されます。計算フィールドに追加すると、4分のクエリになります。 これが正しい結果を返す、私が思いつくことができた最高のバージョンです。パフォーマンスをそれほど犠牲にすることなく、このAS A VIEWをどのように再構築できるかについてのアイデアを探しています。 私はこれが遅くなる理由を理解しています(where句で述語を計算する必要があります)が、それを構造化して同じ結果を得る別の方法を考えることはできません。 以下に、テーブルを構築し、CTEを私の環境で動作するように正確に実行するためのサンプルコードを示します。 Use Tempdb go CREATE TABLE dbo.Account ( Acctid varchar(1) NOT NULL , Name varchar(30) NULL , ParentId varchar(1) NULL , CustomerCount int NULL ); INSERT Account SELECT 'A','Best Bet',NULL,21 UNION ALL SELECT 'B','eStore','A',30 UNION ALL SELECT 'C','Big Bens','B',75 UNION ...

2
CTE内から呼び出されたときにPostgreSQL関数が実行されない
私の観察を確認し、なぜこれが起こっているのかについて説明を得たいと思っています。 私は次のように定義された関数を持っています: CREATE OR REPLACE FUNCTION "public"."__post_users_id_coin" ("coins" integer, "userid" integer) RETURNS TABLE (id integer) AS ' UPDATE users SET coin = coin + coins WHERE userid = users.id RETURNING users.id' LANGUAGE "sql" COST 100 ROWS 1000 VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER CTEからこの関数を呼び出すと、SQLコマンドは実行されますが、関数はトリガーされません。次に例を示します。 WITH test AS (SELECT ...
14 postgresql  cte 

2
CTEをセミコロンで開始する必要があるのはなぜですか?
Aaron Bertrandが数値テーブルの代わりにCTEを使用することを提案しているStackOverflowの投稿を見ているところです。私の質問は、なぜCTEの最初の行がセミコロンで始まるのですか? ;WITH n AS (SELECT TOP (10000) n FROM (SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ) AS x ORDER BY n ) SELECT n FROM n ORDER BY n; -- look ma, no gaps! これは、WITHステートメントが以前のSELECT何かに解析されないようにするためですか?WITHの前にセミコロンを使用することについて、SQL Server 2005 BOLには何も表示されません。
13 sql-server  t-sql  cte  syntax 

1
SQL Server監査データからスカラー値のユーザー定義関数の使用を除外する方法
データベースに対するすべての実行アクションを監査するデータベース監査仕様を持つSQL Serverデータベースがあります。 CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) 一部のクエリは、結果セットのすべての行に対してスカラー関数の使用を監査ログに書き込むことがわかっています。これが発生すると、ログがETLで最終的な休憩場所に達する前にログがいっぱいになり、ログにギャップが生じます。 残念ながら、コンプライアンス上の理由により、すべてのEXECUTEステートメントの監査を停止することはできません。 この問題へのアプローチについて最初に考えたのはWHERE、サーバー監査の句を使用してアクティビティを除外することです。コードは次のようになりました。 WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) 残念ながら、SQL ServerはリレーショナルIN演算子を許可しません(おそらく、監査ログに書き込む必要があるたびにクエリを実行したくないためです)。 私たちは、どのハードコードストアドプロシージャ書き込みを避けたいobject_idにWHERE句が、それは、この問題にアプローチする最良の方法で私たちの現在の考え方です。考慮すべき代替アプローチはありますか? 再帰CTEでスカラー関数が使用されている場合、結果セット内のすべての行の監査ログにクエリが書き込まれることに気付きました。 ベンダーが提供するいくつかのスカラー値関数がありますが、それらを削除したり、代替データベースに移動したりすることはできません。

1
再帰クエリの結果をツリーのように展開してソートするにはどうすればよいですか?
あなたが持っていると仮定しましょう nodesようなテーブル。 CREATE TABLE nodes ( node serial PRIMARY KEY, parent integer NULL REFERENCES nodes(node), ts timestamp NOT NULL DEFAULT now() ); これは、最上位にルートノードがあり、ルートノードまたは他の子ノードからぶら下がっているいくつかの子ノードを持つ、標準的なノードのようなツリー構造を表します。 いくつかのサンプル値を挿入しましょう: INSERT INTO nodes (parent) VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1) , (6), (9), (6), (6), (3), (3), (3), (15); 次に、深さ4までの最初の10個のルートノードとそのすべての子を取得します。 WITH ...

2
CTEに挿入された行を同じステートメントで更新できないのはなぜですか?
PostgreSQL 9.5では、次のように作成された単純なテーブルがあるとします。 create table tbl ( id serial primary key, val integer ); SQLを実行して値を挿入し、次に同じステートメントでUPDATEします。 WITH newval AS ( INSERT INTO tbl(val) VALUES (1) RETURNING id ) UPDATE tbl SET val=2 FROM newval WHERE tbl.id=newval.id; その結果、UPDATEは無視されます。 testdb=> select * from tbl; ┌────┬─────┐ │ id │ val │ ├────┼─────┤ │ 1 │ ...
12 postgresql  cte 

1
型修飾子を使用したデータ型の驚くべき結果
この質問に対する再帰的なCTEソリューションについて説明しながら: 各IDの最後の5つの異なる値を取得する @ypercubeは驚くべき例外に出くわし、型修飾子の処理を調査することになりました。私たちは驚くべき行動を見つけました。 1.型キャストは、一部のコンテキストで型修飾子を保持します しないように指示された場合でも。最も基本的な例: SELECT 'vc8'::varchar(8)::varchar 一つは、期待していないかもしれないvarchar私は、少なくとも、(無修正)でしょう。しかし、結果はvarchar(8)(修飾子付き)です。以下のフィドルで関連する多くのケース。 2.配列の連結により、一部のコンテキストで型修飾子が失われる 必要がないので、これは反対側でエラーになります: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) 最初の式はvarchar(8)[]期待どおりに生成されます。 しかし、2番目は、連結した後、別のものvarchar(8)がvarchar[]修正されます(修飾子なし)。からの同様の動作、array_append()以下のフィドルの例。 このすべては、ほとんどの状況で重要ではありません。Postgresはデータを失わず、列に割り当てられると、値はとにかく正しい型に強制されます。ただし、反対方向にエラーを発生させると、驚くべき例外が発生します。 3.再帰的なCTEは、完全に一致するデータ型を要求します この単純化されたテーブルを考えると: CREATE TABLE a ( vc8 varchar(8) -- with modifier , vc varchar -- without ); INSERT INTO a VALUES ('a', 'a'), ('bb', 'bb'); このrCTEはvarchar列に対しては機能しvcますが、varchar(8)列に対しては失敗しますvc8。 WITH RECURSIVE cte AS ( ...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.