0

1 つの SQL クエリのフレーミングに問題があります。以下で説明するように、トランザクション ID に基づいてすべてのレコードを選択する必要があります。

  1. ユーザーがトランザクション TX444 を指定したと仮定すると、指定されたトランザクションの Child Id = Parent Id および Parent_Id = 既に選択されているレコードの Child_Id を持つすべてのレコードを取得する必要があります。

TRansaction に TX444 を指定すると、表示されているすべてのレコードが選択されます。

  1. ユーザーがTransaction = TX234を与えられたと仮定すると、Child Id = Parent Id of given transaction AND Parent_Id = Child_Id of already selected recordsのすべてのレコードをフェッチする必要があります。この場合、最後のレコードは含まれません。

SELECT クエリを作成しようとしています。しかし、何も機能していません:(

PARENT_ID       CHILD_ID                   TRANSACTION        STATE
1               4                           TX123           PF
2               4                           TX128           PS
3               5                           TX230           FF
4               5                           TX234           FS
5               0                           TX444           DS

私はSQLの人ではありませんが、これを補う必要があります

4

1 に答える 1

2

Oracle では、CONNECT BYを使用して行を再帰的にループできます。

SELECT  Parent_ID, 
        Child_ID, 
        Transaction, 
        State,
        CASE Level WHEN 1 THEN 'Selected' ELSE 'Child' END AS Relation
FROM    Transactions
START WITH Transaction = 'TX444'
CONNECT BY PRIOR Child_ID = Parent_ID
UNION
SELECT  Parent_ID, 
        Child_ID, 
        Transaction, 
        State,
        CASE Level WHEN 1 THEN 'Selected' ELSE 'Parent' END AS Relation
FROM    Transactions
START WITH Transaction = 'TX444'
CONNECT BY PRIOR Parent_ID = Child_ID;

SQL Fiddleに例を示しましたが、データにわずかに異なる子/親を使用CONNECT BYして、親/子を取得するだけでなく、それぞれの世代を特定するために使用する方法を完全に示しました。

于 2012-07-13T10:16:01.537 に答える