1

この質問は次の質問に基づいていますが、追加の要件があります: PostgreSQL: 線形の「祖先 - 子孫」関係で最後の子孫を見つける方法

基本的に、必要なのは、追加の基準に一致する直線的な「祖先 - 子孫」関係で最後の子孫を見つける Postgre-SQL ステートメントです。

例:

テーブル「RELATIONSHIP_TABLE」の内容は次のとおりです。

id | id_ancestor | id_entry | bool_flag
---------------------------------------
1  | null        | a        | false
2  | 1           | a        | false
3  | 2           | a        | true
4  | 3           | a        | false
5  | null        | b        | true
6  | null        | c        | false
7  | 6           | c        | false

特定の階層内のすべてのレコードは同じ「id_entry」を持ちます。この例には、3 つの異なる「祖先 - 子孫」関係があります。

1.    1 <- 2 <- 3 <- 4
2.    5
3.    6 <- 7

質問PostgreSQL: 線形の「祖先 - 子孫」関係で最後の子孫を見つける方法は、各関係の最後のレコードを見つける方法を示しています。上記の例では:

1.    4
2.    5
3.    7

したがって、今回必要なのは、「bool_flag」が true に設定されている「id_entry」による最後の子孫です。上記の例では:

1.    3
2.    5
3.    <empty result>

誰かが解決策を知っていますか?

前もって感謝します :)

QストームDS

4

2 に答える 2

1
WITH RECURSIVE tail AS (
    SELECT id AS opa
            , id, bool_flag FROM boolshit
    WHERE bool_flag = True
    UNION ALL
    SELECT t.opa AS opa
    , b.id, b.bool_flag FROM boolshit b
    JOIN tail t ON b.id_ancestor = t.id
    )
SELECT *
FROM boolshit bs
WHERE bs.bool_flag = True
AND NOT EXISTS (
    SELECT * FROM tail t
    WHERE t.opa = bs.id
    AND t.id <> bs.id
    AND t.bool_flag = True
    );

説明: bool_flag が設定されているすべてのレコードを選択します。ただし、bool_flag が設定されている子孫 (直接的または間接的) を持つレコードも除外します。これにより、フラグが設定されているチェーンの最後のレコードが効果的に選択されます。

于 2013-06-21T08:49:49.567 に答える