如何合并两个独立SQL查询?求助解决Oracle报错问题
问题分析与解决
两个报错的原因
- ORA-00933:你第一个写法的SQL语法顺序完全错误。SQL的执行逻辑是先处理
FROM/JOIN,再处理WHERE过滤,最后才是ORDER BY排序。你把ORDER BY放在JOIN前面,数据库无法识别正确的命令结构,所以报错。 - ORA-00918:
SORT_CODE和ACCOUNT_NO在CUSTOMER和ACCOUNT两个表中都存在,你直接写SORT_CODE||ACCOUNT_NO时,数据库不知道要取哪个表的字段进行拼接,导致列定义歧义。
正确的合并写法
基础关联写法(获取所有匹配的记录)
给表添加别名,明确每个字段的来源,同时调整语法顺序:
SELECT c.SORT_CODE || c.ACCOUNT_NO AS ACCOUNT_ID, c.COLLATERAL_ID, c.LOAN_SIZE, c.CURRENT_BALANCE, c.processing_date, a.APPLICATION_CREATED_DATE, a.APPLICATION_ID, a.DT_OUTCOME FROM CUSTOMER c INNER JOIN ACCOUNT a ON c.SORT_CODE || c.ACCOUNT_NO = a.SORT_CODE || a.ACCOUNT_NO WHERE c.processing_date = '08-JAN-24' ORDER BY c.LOAN_SIZE DESC;
关联最新申请记录(利用原查询的row_number逻辑)
如果需要每个账户的最新申请记录,把ACCOUNT的查询包装成子查询,先过滤出rank=1的结果再关联:
SELECT c.SORT_CODE || c.ACCOUNT_NO AS ACCOUNT_ID, c.COLLATERAL_ID, c.LOAN_SIZE, c.CURRENT_BALANCE, c.processing_date, a.APPLICATION_CREATED_DATE, a.APPLICATION_ID, a.DT_OUTCOME FROM CUSTOMER c INNER JOIN ( SELECT SORT_CODE || ACCOUNT_NO AS ACCOUNT_ID, APPLICATION_CREATED_DATE, APPLICATION_ID, DT_OUTCOME, ROW_NUMBER() OVER (PARTITION BY SORT_CODE || ACCOUNT_NO ORDER BY APPLICATION_CREATED_DATE DESC) AS rank FROM ACCOUNT ) a ON c.SORT_CODE || c.ACCOUNT_NO = a.ACCOUNT_ID WHERE c.processing_date = '08-JAN-24' AND a.rank = 1 -- 只保留每个账户最新的申请记录 ORDER BY c.LOAN_SIZE DESC;
说明
- 表别名
c(CUSTOMER)和a(ACCOUNT)用来明确字段来源,解决列歧义问题。 - 语法顺序严格遵循
FROM/JOIN → WHERE → ORDER BY的规则,避免语法错误。 - 如果需要保留
CUSTOMER中所有符合条件的记录(即使ACCOUNT中无匹配),可以把INNER JOIN换成LEFT JOIN。
内容的提问来源于stack exchange,提问作者Neal
相关产品推荐
相关产品推荐

