【问题标题】:Self Join query on cascading results级联结果的自联接查询
【发布时间】:2012-07-13 18:16:01
【问题描述】:

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

  1. 假设用户给定事务 TX444,我需要获取所有具有子 ID = 给定事务的父 ID 和 Parent_Id = Child_Id 的已选择记录的记录。

因此,如果我将 TRansaction 设为 TX444,则应选择显示的所有记录。

  1. 假设用户给定 Transaction = TX234,那么我需要获取 Child Id = 给定事务的 Parent Id 且 Parent_Id = Child_Id 的已选择记录的所有记录。 在这种情况下,将不包括最后一条记录。

我正在尝试编写 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 人,但我需要弥补这一点

【问题讨论】:

  • 您使用的是什么 DBMS?

标签: sql select self-join


【解决方案1】:

在 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 而不仅仅是让父母/children,还要确定每个是哪一代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多