Вы можете добиться этого с помощью Recursive 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 |
+------------+--------------+---------+-----------+-----------+