Oracle SQL Разработчик - ПРИСОЕДИНЯЙТЕСЬ к 2 запросам с отношением один ко многим - PullRequest
0 голосов
/ 06 марта 2020

У меня есть два запроса, которые я пытаюсь объединить.

В first_query TABLE2.PROCESS_ID каждый PROCESS_ID уникален в этой таблице. В second_query хотя есть несколько PROCESS_ID с одинаковым номером в TABLE3, поэтому я думаю, что мне нужно сделать соединение один ко многим. join_query, которое я имею, дает мне ошибку ORA-00933: SQL command not properly ended, которая, как я предполагаю, как-то связана с отношением один-ко-многим с JOIN.

Я не совсем уверен, как решить это. Любая помощь будет высоко ценится!

first_query = """
SELECT TABLE1.RULE_ID, TABLE2.STATUS, TABLE2.ERROR_MESSAGE, TABLE2.PROCESS_ID
FROM TABLE2 LEFT JOIN
     TABLE1
      ON TABLE1.RULE_ID = TABLE2.RULE_ID 
WHERE TABLE1.RULE_NAME IN ('TEST1', 'TEST2')   
"""

second_query = """
SELECT RECORDS_PROCESSED, PROCESS_ID, STATUS
FROM TABLE3
"""

join_query = """
SELECT RULE_ID, STATUS, ERROR_MESSAGE, PROCESS_ID
FROM (first_query) as query_1
INNER JOIN (second_query) as query_2
ON query_1.PROCESS_ID = query_2.PROCESS_ID 
GROUP BY PROCESS_ID desc
"""

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вы не можете выбрать 4 столбца и сгруппировать только по одному из них, если только вы не включили выбранные столбцы в функцию агрегации (например, max (), sum (), ...). Один из вариантов таков:

SELECT query_1.RULE_ID         --1
       , query_2.STATUS        --2
       , query_1.ERROR_MESSAGE --3
       , query_1.PROCESS_ID    --4
FROM (SELECT TABLE1.RULE_ID
             , TABLE2.STATUS
             , TABLE2.ERROR_MESSAGE
             , TABLE2.PROCESS_ID
      FROM TABLE2 
      LEFT JOIN TABLE1
      ON TABLE1.RULE_ID = TABLE2.RULE_ID 
      WHERE TABLE1.RULE_NAME IN ('TEST1', 'TEST2')) query_1
INNER JOIN (SELECT RECORDS_PROCESSED
                   , PROCESS_ID
                   , STATUS
            FROM TABLE3) query_2
ON query_1.PROCESS_ID = query_2.PROCESS_ID 
GROUP BY query_1.RULE_ID
         , query_2.STATUS
         , query_1.ERROR_MESSAGE
         , query_1.PROCESS_ID

Также, пожалуйста, подумайте об использовании псевдонимов, подобных этому (в первом запросе):

SELECT T1.RULE_ID
       , T2.STATUS
       , T2.ERROR_MESSAGE
       , T2.PROCESS_ID
FROM TABLE2 T2 
LEFT JOIN TABLE1 T1 ON T1.RULE_ID = T2.RULE_ID 
WHERE T1.RULE_NAME IN ('TEST1', 'TEST2')   

Кроме того, примените те же логики c с псевдонимы в вашем последнем запросе, иначе у вас возникнет ошибка другого типа: " ORA-00918: столбец неоднозначно определен "

Вот небольшая демонстрационная версия

0 голосов
/ 06 марта 2020

CTE (т. Е. Предложение факторинга WITH) может помочь.

WITH first_query
     AS (SELECT table1.rule_id,
                table2.status,
                table2.error_message,
                table2.process_id
           FROM table2 LEFT JOIN table1 ON table1.rule_id = table2.rule_id
          WHERE table1.rule_name IN ('TEST1', 'TEST2')),
     second_query
     AS (SELECT records_processed, process_id, status FROM table3)
SELECT a.rule_id,
       a.status,
       a.error_message,
       a.process_id
  FROM first_query a INNER JOIN second_query b ON a.process_id = b.process_id

GROUP BY, которое вы использовали, недопустимо; Вы не можете сгруппировать результаты только по одному столбцу. Если результаты должны быть уникальными, используйте select distinct. Если вам нужно использовать group by, укажите все столбцы, возвращаемые select (что возвращает вас к тому, что делает distinct), или посмотрите, должны ли некоторые столбцы быть агрегатами - в этом случае, group by имеет смысл.

Кроме того, вы должны всегда использовать псевдонимы таблиц. Без них запрос недействителен, так как ядро ​​базы данных не знает, к какой таблице принадлежат эти столбцы (если они имеют одно и то же имя).

...