ORA-00904: неверный идентификатор. "TT". "H_NO": неверный идентификатор - PullRequest
2 голосов
/ 29 марта 2020

Я неопытный в Oracle, я не понимаю, где я делаю неправильно. Мой запрос выполняет MSS SQL плавно, но я получаю ошибку в 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

Ответы [ 2 ]

3 голосов
/ 29 марта 2020

Используйте, как показано ниже, в вашей версии 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
1 голос
/ 29 марта 2020

Если у вас есть таблицы:

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 | MALIYET
---: | ------:
   1 |       1

db <> fiddle здесь

Если вы обновитесь до более современной версии Oracle db <> fiddle , тогда ваш коррелированный запрос работает.

Кроме того, CHARINDEX не является функцией Oracle. Вместо этого вам нужно использовать INSTR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...