検索クエリ内でSQL変数を定義します -- sql フィールド と common-table-expression フィールド 関連 問題

Define SQL variable inside the retrieving query












1
vote

問題

日本語

私は特定の子供/孫のトップレベルの親を取得するために再帰的(CTEを使用)クエリを持っています。そして、私は子供/孫のIDを含む大きなビューを持っています。これが私の再帰的クエリです:

<事前> <コード> DECLARE @childID INT SET @childID = 16579; --child to search WITH RCTE AS ( SELECT *, 1 AS Lvl, Company.CompanyID As Child FROM Company WHERE CompanyID = @childID UNION ALL SELECT rh.*, Lvl+1 AS Lvl, rh.CompanyID As Child FROM Company rh INNER JOIN RCTE rc ON rh.CompanyID = rc.ParentID ) SELECT TOP 1 p.CompanyID, p.CompanyName, r.Child FROM RCTE r inner JOIN Company p ON p.CompanyID= r.ParentID ORDER BY lvl DESC

再帰を実行する必要なしに、Grand Parent / Parent(最上位親が1つのクエリの最上位親がある)を取得するビュー内の @childID の設定方法はありますか。ビューの各行に別々に機能しますか?

英語

I have a recursive (using CTE) query to get the top level parent of a certain child/grandchild. And I have a big view that contains the id of the child/grandchild. Here is my recursive query:

DECLARE @childID INT  SET @childID  = 16579; --child to search  WITH RCTE AS (     SELECT *, 1 AS Lvl, Company.CompanyID As Child FROM Company      WHERE CompanyID = @childID      UNION ALL      SELECT rh.*, Lvl+1 AS Lvl, rh.CompanyID As Child FROM Company rh     INNER JOIN RCTE rc ON rh.CompanyID = rc.ParentID ) SELECT TOP 1 p.CompanyID, p.CompanyName, r.Child FROM RCTE r inner JOIN Company p ON p.CompanyID= r.ParentID ORDER BY lvl DESC 

Is there a way of setting the @childID inside the view to retrieve the grand parent/parent (what ever the top level parent is) of all records in one query without the need to run the recursive function for each row of the view separately?

</div
     
 
 

回答リスト

1
 
vote
vote
ベストアンサー
 

CTEの一部としてベースの子IDを含めて再帰の反復を停止した場合、SQLエンジンはそれを適切に制限するのに十分な大きさであり、あなたはと同じくらい良いところでパフォーマンスを得るべきです。変数。確認するためにいくつかの素早いテストをしました。

例:

<事前> <コード> CREATE VIEW Company_Hierarcy AS WITH RCTE AS ( SELECT C.Name, -- etc., since we never actually use SELECT * C.CompanyID, C.ParentID, 1 AS Lvl, C.CompanyID AS BaseID FROM dbo.Company C UNION ALL SELECT C2.Name, C2.CompanyID, CTE.Lvl+1 AS Lvl, CTE.BaseID AS BaseID FROM RCTE CTE INNER JOIN Company C2 ON C2.CompanyID = CTE.ParentID ) SELECT R.Name, R.CompanyID, R.ParentID, R.lvl, R.BaseID FROM RCTE R

その後のパフォーマンスを確認できます。

<事前> <コード> SELECT * FROM Company_Hierarcy

対:

<事前> <コード> SELECT * FROM Company_Hierarcy WHERE BaseID = 16579
 

If you include the base child ID as part of the CTE and carry it down through the iterations in the recursion then the SQL engine should be smart enough to limit it appropriately and you should get performance just as good as you would with the variable. I just did some quick tests to confirm.

An example:

CREATE VIEW Company_Hierarcy AS     WITH RCTE AS     (         SELECT             C.Name, -- etc., since we never actually use SELECT *             C.CompanyID,             C.ParentID,             1 AS Lvl,             C.CompanyID AS BaseID         FROM             dbo.Company C          UNION ALL          SELECT             C2.Name,             C2.CompanyID,             CTE.Lvl+1 AS Lvl,             CTE.BaseID AS BaseID         FROM             RCTE CTE         INNER JOIN Company C2 ON C2.CompanyID = CTE.ParentID     )     SELECT         R.Name,         R.CompanyID,         R.ParentID,         R.lvl,         R.BaseID     FROM         RCTE R 

You can then check the performance of:

SELECT * FROM Company_Hierarcy 

versus:

SELECT * FROM Company_Hierarcy WHERE BaseID = 16579 
</div
 
 

関連する質問

1  ストアドプロシージャ内で句とともに使用します  ( Use with clause inside a stored procedure ) 
WITH 句を使用して、ストアドプロシージャ内にテーブルを埋めます。セッションが生きている間に、この句はデータをメモリに保持していることを読んでいました。 Sprlinkと呼ばれる更新が必要な情報を持つテーブルがありますが、そのテーブルは何百万ものレコー...

3  CTEを使用するという利点/欠点は何ですか?  ( What are the advantages disadvantages of using a cte ) 
私はいくつかのSQLのパフォーマンスの向上を見据えて、現在CTESはスクリプト内で複数回使用されています。代わりにテーブル変数を使用して改良を受けますか? (コードが関数内にあるため、一時テーブルを使用できません)。 ...

3  構文エラー:この位置に有効な入力ではありません  ( Syntax error with is not valid input in this position ) 
だから私はこのような要求を持っています <事前> <コード> WITH customers_in_usa AS ( SELECT customerName, state FROM ...

2  CTEを使用した開始日と終了日の問題  ( Problem in start and end dates using cte ) 
以下の入力 <事前> <コード> ID Activity Date 1 gardening 2011-01-01 00:00:00.000 1 gardening 2011-02-01 00:00:00.000 2 cooking ...

151  CTEと副照会の違いは?  ( Difference between cte and subquery ) 
この投稿からの使用方法以下の手順? sub-query を使用し、もう1つは<コード> CTE を使用して同じ問題を解決するための2つのバージョンの回答があります。 次に、「サブクエリ」を介して<コード> CTE (Common Table Expres...

2  SQL CTE Childs recursion  ( Sql cte counting childs recursion ) 
そのようにしているテーブルの中の子供を(CTEを使って)子供たちの親レベルで子供を数えています子供の子どもたちを含むの。利用可能なサンプルはありますか? ...

1  再帰的なCTEを再帰的な副照会に変換します  ( Convert recursive cte to recursive subquery ) 
次のCTEを再帰的な副照会に変換する方法は? NewTonsメソッドの実装です。 理由: 1)DB に関数または保存されているPROCを作成するための No 権限があります。 2)TSQL ですべてを行わなければなりません 3)Oracle を使用しな...

0  CTE内のテーブルのVARを使用してSQL(アズール)  ( Sql azure using a table var inside a cte ) 
私のストアドプロシージャは、リストされた各StockNameについて「最終取引」/「最高入札」を見つけるために、共通テーブル式を作成します(コードが長いが、使用しています: <事前> <コード> -a3 と国= 'USA') 上に示したSPを通って、ループ:...

3  CTEを使用せずに親子階層パス  ( Parent child hierarchy path without using cte ) 
こんにちは私は以下の表があります: <事前> <コード> create table Features ( FeatureId bigint, FeatureName varchar(255), ParentId bigint ) insert into Fe...

2  Oracle SQL - ステートメントを使用して使用するときに更新できません  ( Oracle sql unable to update when using with statement ) 
withステートメントを介して作成された仮想データセットに基づいて列を更新しようとしています。私は根本的な問題に到達するために声明をできるだけ単純化しました。 Withステートメントを使用すると更新がうまくいかないようですが、これは正確であるとは思わない。私...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有