【问题标题】:ORA-00904: invalid identifier. "TT"."H_NO": invalid identifierORA-00904: 无效的标识符。 "TT"."H_NO": 无效标识符
【发布时间】:2020-03-29 10:29:58
【问题描述】:

我在 Oracle 方面没有经验,我不明白我在哪里做错了。我的查询正在顺利运行 MSSSQL,但我在 oracle 中遇到错误。

ERROR ( AND MTH.M_NO =TT.H_NO) MALIYET)
ORA-00904: "TT"."H_NO": invalid identifier.
select TT.H_NO, 
       TV.H_TARIH,
       TV.H_BITTAR,

       ( SELECT SUM(
                  ( M_SYTOPLAM
                  + M_COCUK
                  + M_YAKACAK
                  + M_MTOPLAM
                  + M_FMTOPLAM
                  + ( ( M_SSKI + M_EK2 + M_EK1)
                    + M_TISVEREN
                    + M_HOLKES
                    + M_HOLKES1
                    )
                  - M_BRUTKES
                  + M_ESIPRIM
                  + M_ESARTIS
                  + M_XEK9
                )
                - ( CASE
                    WHEN CHARINDEX('05510',NVL(MTK.M_CHR1,MTH.M_EKKOD2)) > 0
                    AND  MTH.M_XSGRT=1
                    THEN ROUND((MTH.M_SSKM + MTH.M_EK3) * 0.05,2)
                    ELSE 0.00
                    END
                  + ( CASE
                      WHEN MTH.M_XSGRT = 1
                      AND  RTRIM(NVL(M_EKKOD2,' '))='05746'
                      AND  MTH.M_SSKI>0
                      AND  MTH.M_XEK4 =0
                      THEN ROUND((MTH.M_SSKM - ROUND(((((MTH.M_TARTIS*2))/(MTH.M_SSKI))*MTH.M_SSKM),2))*.05,2)
                      ELSE 0
                      END
                    )
                  )
                )
         FROM   H_MATRAH MTH
                INNER JOIN H_MATEK MTK
                ON MTH.M_NO=MTK.M_NO      
                   AND MTH.M_YIL=MTK.M_YIL
                   AND MTH.M_AY=MTK.M_AY
                   AND MTH.M_SKOD=MTK.M_SKOD
                   AND MTH.M_YIL = 2020
                   AND MTH.M_AY = 3
                   AND MTH.M_NO =TT.H_NO
       ) MALIYET
from   TERFNAKL TT
       INNER JOIN TERFNAKLV TV
       ON TT.H_NO=TV.H_NO

【问题讨论】:

  • 发布TERFNAKL 的架构。
  • 看来是您的 oracle 版本导致了您的问题。这是小提琴https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=aca5b86ba7105f48cf19e74d4fb20504。换成18c没问题,11g R2出现问题。

标签: sql oracle oracle11g


【解决方案1】:

在您的 Oracle 版本中像下面这样使用

替换

   AND MTH.M_NO =TT.H_NO

   WHERE MTH.M_NO =TT.H_NO

我已经运行了一些测试来识别问题

下面的不行

select (select tt.today  from dummy1  tb 
INNER JOIN dummy1 tc on  
tb.branch_code=tc.branch_code 
and tb.eof=tc.eof 
and  tb.branch_code=tt.branch_code )
from dummy2 tt

下面的作品

select (select tt.today  from dummy1  tb 
INNER JOIN dummy1 tc on  
tb.branch_code=tc.branch_code 
and tb.eof=tc.eof 
where  tb.branch_code=tt.branch_code )
from dummy2 tt

【讨论】:

  • 感谢您的帮助@psaraj。我应用了您的建议。我遇到了另一个错误。 ORA-03113:通信通道上的文件结束进程 ID:1648 会话 ID:198 序列号:39564
  • wc @OnurÖnder 参考此链接进行故障排除dba-oracle.com/…
【解决方案2】:

如果你有桌子:

CREATE TABLE tt ( h_no ) AS
SELECT 1 FROM DUAL;

CREATE TABLE mth ( m_no ) AS
SELECT 1 FROM DUAL;

CREATE TABLE mtk ( m_no ) AS
SELECT 1 FROM DUAL;

然后查询:

select h_no, 
       ( select mth.m_no
         from   mth
                inner join mtk 
                on  (   MTH.M_NO=MTK.M_NO 
                    AND MTH.M_NO = tt.H_NO )
       ) maliyet
from   tt;

给出异常:

ORA-00904: "TT"."H_NO": invalid identifier

但是,如果您将用于关联的过滤条件从 JOIN 条件中移出并移到 WHERE 子句中(在相关子查询的外部级别中):

select h_no, 
       ( select mth.m_no
         from   mth
                inner join mtk 
                on ( MTH.M_NO=MTK.M_NO )
         WHERE  MTH.M_NO = tt.H_NO
       ) maliyet
from   tt;

然后查询输出:

H_NO |马利耶 ---: | ------: 1 | 1

db小提琴here

如果您升级到更现代的 Oracle db<>fiddle 版本,那么您的相关查询就可以工作。

另外,CHARINDEX 不是 Oracle 函数。相反,您需要使用INSTR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2022-01-22
    • 2019-06-29
    相关资源
    最近更新 更多