Извлечение записей дочерних объектов из значений других таблиц в запросе SQL - PullRequest
0 голосов
/ 31 января 2020

enter image description here

В столбцах Service_line_TABLE столбец line_on_structure имеет значение «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) ) )

1 Ответ

0 голосов
/ 31 января 2020

Вы можете добиться этого с помощью 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      |
+------------+--------------+---------+-----------+-----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...