0

みなさん、良い一日を!まず、下手な英語で申し訳ありません。さて、このメッセージのタイトルにある質問があります。

必要なデータを選択しようとすると、SQL Server がこのメッセージ (エラー 253) を返します。

「CTEの再帰要素(名前は「再帰」です-私のメモ)には、CTEで複数の参照があります。

どうすればこの問題を解決できますか?

以前の再帰選択の結果である 2 つのテーブル (2 つの列 (例: a と b)) を結合する方法を教えてください (同じ選択について書いていますが、if の別の反復について書いています)。

    with recurse (who_acts,on_whom_influence)
as 
(
-------------------------------------------FIRST SELECT
select  distinct interface_1.robot_name as who_acts,interface_2.robot_name as on_whom_influence
from INTERFACE as interface_1,INTERFACE as interface_2
    where (interface_1.number in (                                  select  INPUT_INTERFACE.source
                                        from INPUT_INTERFACE
                                )
            and interface_2.number in (
                                        select INPUT_INTERFACE.number 
                                        from INPUT_INTERFACE
                                        where (INPUT_INTERFACE.source=interface_1.number )
                                     )
          )

-------------------------------------------RECURSIVE PART   
union all
select rec1.who_acts,rec1.on_whom_influence
from recurse as rec1
inner join 
(select rec2.who_acts,rec2.on_whom_influence
from recurse as rec2) as P on (1=1)
)
select  * from recurse

問題は再帰CTE にあります。接続条件は単純ではありませんが、この問題には影響しません。コメントに実用的なコードを入力できますか

4

1 に答える 1

2

ここにダミーテーブルがあります

create table tbl1 ( a int, b int );
insert tbl1 select 1,2;
insert tbl1 select 11,12;
insert tbl1 select 2,3;
insert tbl1 select 4,5;

そして、あなたと同様のクエリ

with cte as (
  select a,b from tbl1
  union all
  select x.a,x.b from cte x join cte y on x.a=y.a+1
)
select * from cte;

エラー:

共通テーブル式 'cte' の再帰メンバーには、複数の再帰参照があります。: with cte as ( select a,b from tbl1 union all select xa,xb from cte x join cte y on xa=y.a+1 ) select * from cte

基本的に、エラーはまさにそれが言っていることです。再帰セクションに再帰 CTE を 1 回以上表示することはできません。上記では、両方とCTEとしてエイリアスが表示されます。この制限には、CTE が世代ごとではなく深さ優先で再帰されるという事実など、さまざまな理由があります。xy


考えるべきことは、なぜそれが複数回必要になるのかということです。あなたの再帰部分は意味がありません。

select rec1.who_acts,rec1.on_whom_influence
from recurse as rec1
inner join 
(   select rec2.who_acts,rec2.on_whom_influence
    from recurse as rec2) as P on (1=1)

recurse表面的には、実際のテーブル (非 CTE) の場合、次のことが当てはまります。

  1. 生成される行数は ですcount(recurse as [rec1]) x count(recurse as [rec2])
  2. 再帰の行 (rec1) は、再帰の行ごとにそれぞれ複製されるため、#1
  3. rec2 の列は使用されません。rec2 は乗算のみに使用されます

これが実行を許可された場合、クエリの再帰部分は行数を 2 次的に増やし続け、決して終了しません。

于 2013-05-10T12:50:30.890 に答える