Oracle SQL 开发人员 - 加入具有一对多关系的 2 个查询

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

我有两个查询要合并在一起。

first_query TABLE2.PROCESS_ID 中,每个 PROCESS_ID 在 table 中都是独一无二的。在 second_query 中,尽管 TABLE3 中有多个 PROCESS_ID 具有相同的数字,所以我认为我必须进行一对多连接。 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
"""

您不能 select 4 列并仅按其中一列分组,除非您将 select 列作为聚合函数的一部分(如 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')   

此外,在您的最终查询中应用带有别名的相同逻辑,否则您将遇到不同类型的错误:“ORA-00918:列定义不明确

Here is a small demo

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 是有道理的。

此外,您应该始终使用table别名。没有它们,查询将无效,因为数据库引擎不知道 table 这些列(如果它们共享相同的名称)属于哪个。