【问题标题】:Oracle SQL Developer - JOIN on 2 queries with a one-to-many relationshipOracle SQL Developer - 加入 2 个具有一对多关系的查询
【发布时间】:2020-03-06 12:27:19
【问题描述】:

我有两个要尝试合并的查询。

first_queryTABLE2.PROCESS_ID 中,每个PROCESS_ID 在该表中都是唯一的。在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
"""

【问题讨论】:

    标签: java python sql oracle-sqldeveloper jython


    【解决方案1】:

    您不能选择 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')   
    

    另外,在您的最终查询中应用相同的逻辑和别名,否则您将遇到不同类型的错误:“ORA-00918: column ambiguously defined

    Here is a small demo

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多