4

解決できないこのクエリについて、あなたの助けが必要です。これが問題です。たとえば、次のようなテーブルがあるとします。

Father | Son
1      |   2
1      |   3
1      |   4
3      |   5
3      |   6
2      |   7
4      |   8
5      |   9
6      |   10

テーブルが父と息子の関係を表していることがわかるように、1 人の父親のすべての息子 (および息子の息子) を見つける必要があります。たとえば、番号 1 の息子を探している場合、次のようなテーブルが得られます。これ

Father | son
1      |   2
1      |   3
1      |   4
1      |   5
1      |   6
1      |   7
1      |   8
1      |   9
1      |   10

数 3 の息子を探している場合は、次のようになります。

Father | son
3      |   5
3      |   6
3      |   9
3      |   10

わかりました、あなたは私の要点を理解したと思います。次の問題は、テーブル内の各父親に対してそれを行う必要があることです。したがって、最終的に、テーブルは次のようになります。

Father | son
1      |   2
1      |   3
1      |   4
1      |   5
1      |   6
1      |   7
1      |   8
1      |   9
1      |   10
3      |   5
3      |   6
3      |   9
3      |   10
2      |   7
4      |   8
5      |   9
6      |   10

木の上を行くのとよく似ています。私はしばらくの間、このクエリを理解しようとしてきましたが、成功しませんでした。こんなコーデにしました

WITH  son
        AS (
              -- in 
            SELECT  FK_CC_B
            FROM    PG_Rols_CC  
            WHERE   FK_CC_A = @idCC
            UNION ALL
              --recur
            SELECT  t.FK_CC_B
            FROM     PG_Rols_CC AS t
                    JOIN hijos AS a
                      ON t.FK_CC_A = a.FK_CC_B
           )
insert into @TableSons (idSon) SELECT * FROM son

しかし、それは同時に各父親に対して機能するわけではなく、結果のテーブルは少し異なり、息子の ID しかありません。例

son
3
4
5
6
7

あなたが私を助けてくれることを願っています。

4

2 に答える 2

4

すべての父親の子孫を取得する場合WHEREは、共通テーブル式(CTE)の最初の部分の句を削除する必要があります。

2つの列(父と子孫)を出力する場合は、これらの列をCTEの両方の部分に追加する必要があります。

このような:

WITH Son
AS
(
    SELECT
        FK_CC_A AS Father,
        FK_CC_B AS Son
    FROM
        PG_Rols_CC
    UNION ALL
    SELECT
        f.Father,
        s.FK_CC_B AS Son
    FROM
        Son f
        INNER JOIN PG_Rols_CC s ON f.Son = s.FK_CC_A
)

SELECT * FROM Son
于 2012-11-27T22:16:57.593 に答える
3

「再帰」メンバーから「アンカー」部分を参照する必要があります...

この作品のようなものはありません:

WITH  son
        AS (
              -- in 
            SELECT  @Father, Son
            FROM    PG_Rols_CC  
            WHERE   FK_CC_A = @Father
            UNION ALL
              --recur
            SELECT  @Father, Son
            FROM     PG_Rols_CC AS t
                    JOIN son AS s
                      ON s.FK_CC_A = t.FK_CC_B
           )
SELECT * FROM son
于 2012-11-27T22:01:04.083 に答える