【问题标题】:How to fix this ORA-00918 error in this SQL code如何修复此 SQL 代码中的 ORA-00918 错误
【发布时间】:2019-06-04 03:07:27
【问题描述】:

我的代码有 ORA-00918 错误,我找不到问题...下面的代码给了我这个错误。

ORA-00918:列定义不明确

谁能给我一些建议?谢谢

SELECT * FROM (
 SELECT * FROM (
  SELECT ROWNUM AS RNUM, A.XML_MSG_ID, A.LOGIN_ID, A.ORIGINATOR, A.RECIPIENT, A.ERROR_CODE, B.DOC_NO, B.DOC_NAME, B.ERROR_MSG
  FROM XML_MANAGE_TBL A, XML_REFERENCE_TBL B
  WHERE A.XML_MGS_ID = B.XML_MSG_ID
   AND A.ERROR_CODE <> '00000000'
   AND A.XML_MSG_ID >= '20190528' AND (SUBSTR(A.XML_MSG_ID, 1, 8)) <= '20190604' ) C, EBILL_USER D WHERE D.COMP_NUM = '1258169573' AND C.ORIGINATOR = D.ORIGINATOR )
 WHERE RNUM BETWEEN CASE WHEN (1-1) != 0 THEN ((1-1)*50)+1 ELSE (1-1)*50 END
 AND 1*50;

【问题讨论】:

    标签: sql database oracle ora-00918


    【解决方案1】:

    问题很可能出在第二个子查询select *

    SELECT * FROM (
      ... subquery C ...
    ) C, EBILL_USER D WHERE ... AND C.ORIGINATOR = D.ORIGINATOR
    

    D包含与子查询C相同的列,当然ORIGINATOR

    简单地将第二个查询更改为SELECT C.* 并仅添加来自D 的所需列。

    解决ORA-00918 问题的一般方法是从最里面的子查询运行查询并检查返回的列名是否唯一。

    你的情况先试试,应该没问题

      SELECT ROWNUM AS RNUM, A.XML_MSG_ID, A.LOGIN_ID, A.ORIGINATOR, A.RECIPIENT, A.ERROR_CODE, B.DOC_NO, B.DOC_NAME, B.ERROR_MSG
      FROM XML_MANAGE_TBL A, XML_REFERENCE_TBL B
      WHERE A.XML_MGS_ID = B.XML_MSG_ID
       AND A.ERROR_CODE <> '00000000'
       AND A.XML_MSG_ID >= '20190528' AND (SUBSTR(A.XML_MSG_ID, 1, 8)) <= '20190604'
    

    比运行第二个最里面的子查询

    SELECT * FROM (
      SELECT ROWNUM AS RNUM, A.XML_MSG_ID, A.LOGIN_ID, A.ORIGINATOR, A.RECIPIENT, A.ERROR_CODE, B.DOC_NO, B.DOC_NAME, B.ERROR_MSG
      FROM XML_MANAGE_TBL A, XML_REFERENCE_TBL B
      WHERE A.XML_MGS_ID = B.XML_MSG_ID
       AND A.ERROR_CODE <> '00000000'
       AND A.XML_MSG_ID >= '20190528' AND (SUBSTR(A.XML_MSG_ID, 1, 8)) <= '20190604' ) C, EBILL_USER D WHERE D.COMP_NUM = '1258169573' AND C.ORIGINATOR = D.ORIGINATOR   
    

    在您的 IDE(例如 SQL Developer)中,您将看到一个或多个带有后缀 _1 的列,这是必须排除(对于来自等值连接谓词的列)或重命名的重复列的标志。

    【讨论】:

    • 根据您的评论“简单地将第二个查询更改为 SELECT C.* 并仅添加 D 中所需的列”。但是,如果我们需要两个表中的所有列,在这种情况下,具有相同名称的列名将有任何方法,我们将再次遇到相同的错误..任何解决方案??
    • @PranavSri 就这么简单:对于这对列C.ORIGINATOR = D.ORIGINATOR,您只需要一个列(在外连接的情况下使用内表中的列)。如果表 D 包含例如列RECIPIENT 也在C 中,您可以使用其他名称添加它:D.RECIPIENT as D_RECIPIENT
    【解决方案2】:

    您只需要删除最外层的查询并在 where 子句中使用 C.RNUM 而不是 RNUM。试试下面的代码:

    SELECT * FROM (
      SELECT ROWNUM AS RNUM, A.XML_MSG_ID, A.LOGIN_ID, A.ORIGINATOR, A.RECIPIENT, A.ERROR_CODE, B.DOC_NO, B.DOC_NAME, B.ERROR_MSG
      FROM XML_MANAGE_TBL A, XML_REFERENCE_TBL B
      WHERE A.XML_MGS_ID = B.XML_MSG_ID
       AND A.ERROR_CODE <> '00000000'
       AND A.XML_MSG_ID >= '20190528' AND (SUBSTR(A.XML_MSG_ID, 1, 8)) <= '20190604' ) C, EBILL_USER D WHERE D.COMP_NUM = '1258169573' AND C.ORIGINATOR = D.ORIGINATOR
      and (C.RNUM BETWEEN CASE WHEN (1-1) != 0 THEN ((1-1)*50)+1 ELSE (1-1)*50 END AND 1*50);
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 2018-05-05
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多