0

再帰 CTE を使用して TableA からレコードをフェッチする SQL クエリを作成する必要があります。(ツリー構造)。私は彼に「葉」を渡し、根に戻る方法を知りたいです。

これは @SOME_ID 変数で動作します

;WITH cte_recursive AS 
        ( 
            SELECT ID, SUB_ID FROM tableA 
            WHERE SUB_ID = @SOME_ID
            UNION ALL
                SELECT parent.ID, parent.SUB_ID
                FROM tableA parent
                INNER JOIN cte_recursive child ON child.ID = parent.SUB_ID
        ) 

ここで達成する必要があるのは、TableB からすべてのレコードを取得し、CTE 式に tableB.SOME_ID を使用し、CTE が生成する各レコードと TableB のいくつかのフィールドに対して TableC への挿入を作成することです。

(cte_recursive.CHILD_ID、tableB.SomeValue、tableB.SomeOtherValue)

ここでの私の質問は、tableB.SOME_ID を cte 式に渡すにはどうすればよいですか?

したがって、TableA には次のようなものがあります。

ID、SUB_ID

1、2

2 , 3

2 , 4

2 , 5

5 , 6

7、8

8、9

彼に SUB_ID = 5 を渡すと、CTE はレコード #1、#2、#3、#4、#5 を返します。SUB_ID = 5 は ID = 1 の子の子の子であるためです。

4

2 に答える 2

1

テーブル値関数を作成できます

create function ftBranchOf
(
    @SOME_ID int -- actual type of @SOME_ID
)
returns table as return
(
    WITH cte_recursive AS 
    ( 
        SELECT ID, SUB_ID FROM tableA 
        WHERE SUB_ID = @SOME_ID
        UNION ALL
            SELECT parent.ID, parent.SUB_ID
            FROM tableA parent
            INNER JOIN cte_recursive child ON child.ID = parent.SUB_ID
    )
    select * from cte_recursive
)

そして、それをクエリで使用します

insert into TableC (...)
select p.ID, b.SomeValue, b.SomeOtherValue
from TableB b
    cross apply ftBranchOf(b.SOME_ID) p
于 2013-07-22T10:09:33.403 に答える
0

あなたが何を望んでいるのかわからないので、ただ推測するだけです

;WITH cte_tableB AS
(
    SELECT * FROM tableB
)
, cte_recursive AS 
( 
    SELECT ID, SUB_ID, SOME_ID FROM tableA 
    WHERE SUB_ID IN (SELECT SOME_ID FROM cte_tableB)
    UNION ALL
        SELECT parent.ID, parent.SUB_ID, SOME_ID 
        FROM tableA parent
        INNER JOIN cte_recursive child ON child.ID = parent.SUB_ID
) 
INSERT [YourTable] ([YourColumns...])
SELECT [YourColumns...]
FROM cte_recursive
INNER JOIN cte_tableB ON cte_recursive.SomeID = cte_tableB.SomeID
于 2013-07-22T10:06:37.587 に答える