ORA-00918: 未明确定义列

本文详细解析了在SQL查询中如何解决同名列引起的列名冲突问题,通过具体案例展示了为同名列定义别名的方法,确保查询结果的准确性和可读性。
SELECT *
  FROM (SELECT TMP.*, ROWNUM ROW_ID
          FROM (SELECT T.ID,
                       T.APPLY_PER,
                       T.APPLY_STATUS,
                       T.APPROVE_PER,
                       T.APPROVE_TIME,
                       T.TAKE_DOWN_PER,
                       T.TAKE_DOWN_TIME,
                       T.SEAL_PER,
                       T.SEAL_TIME,
                       U.REALNAME,
                       AUS.REALNAME,
                       TU.REALNAME,
                       SU.REALNAME
                  FROM SPV_VOUCHER_BORROW_APPLY T
                  LEFT JOIN SYS_USER U
                    ON T.APPLY_PER = U.ID
                  LEFT JOIN SYS_USER AUS
                    ON T.APPROVE_PER = AUS.ID
                  LEFT JOIN SYS_USER TU
                    ON T.APPROVE_PER = TU.ID
                  LEFT JOIN SYS_USER SU
                    ON T.APPROVE_PER = SU.ID
                 
                 ORDER BY T.APPLY_BEGIN_TIME DESC, T.ID ASC, T.ID ASC) TMP
         WHERE ROWNUM <= 10)
 WHERE ROW_ID > 0

这种SQL 容易出现未明确定义列的情况,因为3个realname,正确的做法应该是

SELECT *
  FROM (SELECT TMP.*, ROWNUM ROW_ID
          FROM (SELECT T.ID,
                       T.APPLY_PER,
                       T.APPLY_BEGIN_TIME,
                       T.APPLY_STATUS,
                       T.APPROVE_PER,
                       T.APPROVE_TIME,
                       T.TAKE_DOWN_PER,
                       T.TAKE_DOWN_TIME,
                       T.SEAL_PER,
                       T.SEAL_TIME,
                       U.REALNAME AS "U.realname",
                       AUS.REALNAME  AS "AUS.realname",
                       TU.REALNAME  AS "tu.realname",
                       SU.REALNAME  AS "su.realname"
                  FROM SPV_VOUCHER_BORROW_APPLY T
                  LEFT JOIN SYS_USER U
                    ON T.APPLY_PER = U.ID
                  LEFT JOIN SYS_USER AUS
                    ON T.APPROVE_PER = AUS.ID
                  LEFT JOIN SYS_USER TU
                    ON T.APPROVE_PER = TU.ID
                  LEFT JOIN SYS_USER SU
                    ON T.APPROVE_PER = SU.ID
                 ORDER BY T.APPLY_BEGIN_TIME DESC, T.ID ASC, T.ID ASC) TMP
         WHERE ROWNUM <= 10)
 WHERE ROW_ID > 0

给3个同名列定义不同名字

rg.springframework.jdbc.BadSqlGrammarException: Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00918: 明确定义 https://docs.oracle.com/error-help/db/ora-00918/ The error may exist in file [D:\WH\xmc-lcdp\target\classes\mapper\XmcLcdpRequestMapper.xml] The error may involve defaultParameterMap The error occurred while setting parameters SQL: SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM (SELECT XLR.ID, XLR.LCDP_NO, XLR.PO_ID, XLR.REQUESTOR, XLR.MOBILE, XLR.DEPT_CODE, XLR.EMAIL, XLR.LC_NO, XLR.ISSUE_DATE, XLR.ISSUE_BANK, XLR.BANK_CHARGES, XLR.DESTINATION, XLR.LC_AMOUNT, XLR.LC_DEPOSIT, XLR.EXPIRY_DATE, XLR.DEPARTURE, XLR.STATUS, XLR.CURRENT_OWNER, XLR.CREATED_AT, XLR.UPDATED_AT, XLR.UPDATED_BY, XLR.VERSION, XLR.IS_DELETED, XLR.TENANT_ID, XLR.APPLICATION_TYPE, XLR.APP_TYPE, XLR.DOCUMENT_DATE, XLR.EXT_NUMBER, XLR.PO_NUMBER, XLR.CURRENCY, XLR.VENDOR, XLR.PO_AMOUNT, XLR.BUYER, XLR.INCO_TERM, XLR.PAYMENT_TERM, XLR.PERCENTAGE, XLR.ACCOUNT_ASSIGN_CATEGORY, XLR.PO_NOTE, XLR.REQUESTED_AMOUNT_WITH_TAX, XLR.DOWN_PAY_PRIORITY, XLR.REQUESTED_DATE, XLR.PAYMENT_TYPE, XLR.TAX_CODE, XLR.REQUESTED_AMOUNT, XLR.EXPIRY_PLACE, XLR.REMARK, XLR.APPLICATION_TYPE, XLR.URGENT_STATUS, XLR.REQUIRE_DATE, XLR.creation_date, XLR.created_by, XLR.last_updated_by, XLR.last_update_date, XLR.object_version_number FROM XMC_LCDP_REQUEST XLR ORDER BY id DESC) TMP_PAGE WHERE ROWNUM <= 20 Cause: java.sql.SQLSyntaxErrorException: ORA-00918: 明确定义 https://docs.ora 什么意思
最新发布
09-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值