Oracle SQL - ORA-00904: «IPA». «CHECK_ID»: неверный идентификатор - PullRequest
0 голосов
/ 04 июля 2018

Когда я запускаю ниже, я получаю ошибку: ORA-00904: "IPA"."CHECK_ID": invalid identifier

Однако данная таблица существует и имеет столбец. Есть идеи?

SELECT *
  FROM ap_invoices_all aia
       INNER JOIN ap_invoice_lines_all aila
          ON aia.invoice_id = aila.invoice_id
       INNER JOIN ap_invoice_distributions_all ida
          ON     aila.invoice_id = ida.invoice_id
             AND aila.line_number = ida.invoice_line_number
       INNER JOIN ap_invoice_payments_all ipa
          ON aia.invoice_id = ipa.invoice_id
       INNER JOIN "poz_suppliers_v" psv ON aia.vendor_id = psv.vendor_id
       INNER JOIN "poz_supplier_sites_v" pssv
          ON     aia.vendor_id = pssv.vendor_id
             AND aia.party_site_id = pssv.party_site_id
       INNER JOIN "gl_code_combinations" gcc
          ON ida.dist_code_combination_id = gcc.code_combination_id,
       iby_payments_all ibypa
       INNER JOIN "ap_checks_all" aca
          ON     aca.check_id = ipa.check_id
             AND aca.payment_id = ibypa.payment_id
       INNER JOIN fun_all_business_units_v fun ON aia.org_id = fun.bu_id

AP_INVOICE_PAYMENTS_ALL определение https://docs.oracle.com/cd/E51367_01/financialsop_gs/OEDMF/AP_INVOICE_PAYMENTS_ALL_tbl.htm

Если я удаляю ошибочную строку, я получаю сообщение о том, что AIA.ORG_ID является неверным идентификатором

Однако, если я сделаю следующее, это не выдаст ошибку:

SELECT *
  FROM ap_invoices_all aia
       INNER JOIN fun_all_business_units_v fun ON aia.org_id = fun.bu_id

Это почти как псевдоним , имеющий , перед самым соединением

1 Ответ

0 голосов
/ 04 июля 2018

Вы смешиваете типы соединений; Oracle в старом стиле соединяется (с запятой), а соответствующие ANSI соединяются. Это приводит к тому, что условия проверяются в порядке, который вы не ожидаете, а некоторые из более ранних псевдонимов еще не существуют.

Парсер эффективно пытается сначала оценить эту часть самостоятельно:

       iby_payments_all ibypa
       INNER JOIN "ap_checks_all" aca
          ON     aca.check_id = ipa.check_id
             AND aca.payment_id = ibypa.payment_id
       INNER JOIN fun_all_business_units_v fun ON aia.org_id = fun.bu_id

и внутри этого фрагмента ipa и aia (пока) не существует, поэтому вы видите ошибки. Если эта часть была в порядке сама по себе, то она была бы присоединена к сбросу секции ANSI, но она не зашла так далеко, потому что она уже видела ошибки. (Я слишком упрощаю, и пытаюсь выяснить, что на самом деле делает парсер, это игра в догадки ... но в этом суть проблемы.)

Измените запятую, за которой следует iby_payments_all ibypa, на перекрестное соединение:

...
       INNER JOIN "gl_code_combinations" gcc
          ON ida.dist_code_combination_id = gcc.code_combination_id,
       iby_payments_all ibypa
       INNER JOIN "ap_checks_all" aca
          ON     aca.check_id = ipa.check_id
             AND aca.payment_id = ibypa.payment_id
       INNER JOIN fun_all_business_units_v fun ON aia.org_id = fun.bu_id

* 1014 FO *

...
       INNER JOIN "gl_code_combinations" gcc
          ON ida.dist_code_combination_id = gcc.code_combination_id
       CROSS JOIN iby_payments_all ibypa
       INNER JOIN "ap_checks_all" aca
          ON     aca.check_id = ipa.check_id
             AND aca.payment_id = ibypa.payment_id
       INNER JOIN fun_all_business_units_v fun ON aia.org_id = fun.bu_id

что похоже на то, что вы делаете; хотя это тоже должно быть внутреннее соединение, если для этой таблицы тоже есть условия соединения, очевидно ...

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