自连接查询级联结果

时间:2012-07-13 05:58:53

标签: sql select self-join

我在构建一个SQL查询时遇到问题。 我需要根据交易ID选择所有记录,如下所述

  1. 假设用户给出了事务TX444,我需要获取所有记录,其中Child Id =给定事务的Parent Id和Parent_Id =已选择记录的Child_Id。
  2. 因此,如果我将TRansaction作为TX444,则应选择显示的所有记录。

    1. 假设用户给出了Transaction = TX234,那么我需要获取具有给定事务的Child Id = Parent Id和已经选择的记录的Parent_Id = Child_Id的所有记录。 在这种情况下,不包括最后一条记录。
    2. 我正在尝试编写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人,但我需要做到这一点

1 个答案:

答案 0 :(得分: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而不仅仅是{{1}}得到父母/子女,还要确定每一代是哪一代。