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:列定义不明确”
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 这些列(如果它们共享相同的名称)属于哪个。
我有两个查询要合并在一起。
在 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:列定义不明确”
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 这些列(如果它们共享相同的名称)属于哪个。