从SQL查询中的其他表值检索子对象记录

从SQL查询中的其他表值检索子对象记录,sql,oracle,Sql,Oracle,在服务\u行\u表中,结构列上的行\u为“TRUE”,然后检索所有子记录。如果不是,则只需重试服务行的对象记录 预期结果表如附图所示 这是我尝试过的查询,但不起作用 SELECT S.contract_id, S.contract_name, L.line_id, O.object_id FROM Service_Line L, Service_Contract S, Object O WHERE ( L.contract_id = S.contract_id AND O.object_id =

在服务\u行\u表中,结构列上的行\u为“TRUE”,然后检索所有子记录。如果不是,则只需重试服务行的对象记录

预期结果表如附图所示

这是我尝试过的查询,但不起作用

SELECT S.contract_id, S.contract_name, L.line_id, O.object_id
FROM Service_Line L, Service_Contract S, Object O
WHERE ( L.contract_id = S.contract_id AND O.object_id = L.object_id )  AND 
      ( ( L.line_on_structure = 'True' AND O.object_id IN ( SELECT object_id
                                                            FROM Object O
                                                            START WITH O.object_id = L.object_id
                                                            CONNECT BY PRIOR O.object_id = O.belongs_to_object AND 
                                                               O.contract = O.belongs_to_site ) ) OR 
                                                               (  L.line_on_structure = 'False' AND O.object_id IN (  
                                                                  SELECT object_id
                                                                  FROM Object O
                                                                  WHERE O.object_id = L.object_id) ) )

您可以使用
递归CTE
而不是查询来实现这一点

WITH mycte(object_id,parent_object_id,line_name,line_id,contract_id,name)
AS ( 
     SELECT o.object_id,o.parent_object_id,s.line_name,s.line_id,s.contract_id,c.name
     FROM   ServiceLine s join object o on s.object_id = o.object_id 
                          join contract c on c.contract_id=s.contract_id
     WHERE s.Line_on_structure = 'TRUE' and o.parent_object_id IS NULL

     UNION ALL

     SELECT o.object_id,o.parent_object_id,m.line_name,m.line_id,m.contract_id,m.name
     FROM  mycte m 
     JOIN   object o
     ON m.object_id = o.parent_object_id )

SELECT  CONTRACT_ID,NAME,LINE_ID,LINE_NAME,OBJECT_ID
FROM  mycte m 
UNION ALL
SELECT s.contract_id,c.name,s.line_id,s.line_name,o.object_id
FROM ServiceLine s join object o on s.object_id = o.object_id
                   join contract c on c.contract_id=s.contract_id
WHERE s.Line_on_structure = 'FALSE' and o.parent_object_id IS NULL

输出:

+------------+--------------+---------+-----------+-----------+
| CONTRACT_ID| NAME         | LINE_ID | LINE_NAME | OBJECT_ID |
+------------+--------------+---------+-----------+-----------+
| 100001     | ABC_CONTRACT | 0001    | XYZ       | OBJ1      |
| 100001     | ABC_CONTRACT | 0001    | XYZ       | OBJ2      |
| 100001     | ABC_CONTRACT | 0001    | XYZ       | OBJ3      |
| 100001     | ABC_CONTRACT | 0001    | XYZ       | OBJ4      |
| 100001     | ABC_CONTRACT | 0001    | XYZ       | OBJ5      |
| 100001     | ABC_CONTRACT | 0002    | DFS       | AAA1      |
+------------+--------------+---------+-----------+-----------+

您是否尝试编写查询,如果是,请将其发布。不要将架构和示例数据作为图像发布。使用
CREATE TABLE
INSERT-INTO
语句。