Java Oracle SQL Developer-使用一对多关系连接2个查询

Java Oracle SQL Developer-使用一对多关系连接2个查询,java,python,sql,oracle-sqldeveloper,jython,Java,Python,Sql,Oracle Sqldeveloper,Jython,我想把两个问题结合起来 在first\u queryTABLE2.PROCESS\u ID中,该表中的每个PROCESS\u ID都是唯一的。在second\u query中,虽然在表3中有几个进程ID的编号相同,但我认为我必须进行一对多连接。我的join\u查询给了我一个错误ORA-00933:SQL命令没有正确结束,我假设这与join的一对多关系有关 我真的不知道如何解决这个问题。任何帮助都将不胜感激 first_query = """ SELECT TABLE1.RULE_ID, TABL

我想把两个问题结合起来

first\u query
TABLE2.PROCESS\u ID中,该表中的每个PROCESS\u ID都是唯一的。在
second\u query
中,虽然在表3中有几个进程ID的编号相同,但我认为我必须进行一对多连接。我的
join\u查询
给了我一个错误
ORA-00933:SQL命令没有正确结束
,我假设这与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
"""

除非将所选列作为聚合功能的一部分(如max()、sum()、…),否则不能选择4列并仅按其中一列进行分组。其中一个选择是:

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

也请考虑使用像这样的别名(在您的第一个查询中):

另外,在最终查询中使用别名应用相同的逻辑,否则将出现不同类型的错误:“ORA-00918:定义不明确的列”

CTE
(即带有保理条款的
)可能会有所帮助

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
您使用的分组依据
无效;不能仅按一列对结果进行分组。如果结果必须是唯一的,请使用
选择distinct
。如果必须使用
分组依据
,请指定
选择
返回的所有列(这将引导您返回到
distinct
所做的操作),或者查看某些列是否必须是聚合的-在这种情况下,
分组依据
是有意义的

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

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