简体   繁体   中英

Oracle SQL Developer - JOIN on 2 queries with a one-to-many relationship

I have two queries that I'm trying to join together.

In first_query TABLE2.PROCESS_ID, every PROCESS_ID is unique in that table. In second_query though there are several PROCESS_ID's with the same number in TABLE3, so I think I have to do a one-to-many join. The join_query I have is giving me an error ORA-00933: SQL command not properly ended which I'm assuming has something to do with the one-to-many relationship with the JOIN.

I'm not really sure how to resolve this. Any help would be much appreciated!

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
"""

You can not select 4 columns and group by only one of them unles you include selected columns as part of aggregation fucntion(like max(), sum(),...). One of the options is this:

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

Also please do consider using aliases like this(in your first query):

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')   

Also, apply the same logic with aliases on your final query or else you will have a different kind of error : " ORA-00918: column ambiguously defined "

Here is a small demo

CTE (ie the WITH factoring clause) might help.

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 you used is invalid; you can't group results by only one column. If results have to be unique, use select distinct . If you have to use group by , specify all columns returned by select (which leads you back to what distinct does), or see whether some column(s) have to be aggregates - in that case, group by makes sense.

Also, you should always use table aliases. Without them, query is invalid as database engine doesn't know which table those columns (if they share the same name) belong to.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM