Почему я получаю ошибку Недопустимый идентификатор, поскольку столбец существует

#oracle #plsql

#Oracle #plsql

Вопрос:

У меня есть статус ВЫБОРА, подобный этому

 SELECT          a.ATAID, 
                a.ataComment, 
                a.Type, 
                a.AtaNumber, 
                a.DeviationNumber, 
                a.ProjectID, 
                a.Name, 
                a.StartDate, 
                a.DueDate, 
                a.RevisionDate, 
                a.Status, 
                a.Ata, 
                a.Deviation,
                a.Locked, 
                a.PaymentType, 
                a.BecomeExternalAtaFromInternal, 
                a.Author, 
                a.AtaType, 
                a.DeviationType, 
                a.PDFUrl, 
                a.street, 
                a.city, 
                a.zip, 
                a.briefDescription, 
                a.ConfirmStatus, 
                a.Token, 
                a.ParentAta, 
                a.EmailSent, 
                a.ClientComment, 
                a.AnswerEmail, 
                a.AnswerTime, 
                a.UserID, 
                a.FromFortnox, 
                a.ForFortnox, 
                a.client_answer_attachment, 
                debitform.Name as paymentTypeName, 
                CONCAT(CONCAT(users.Surname, ' '),users.Lastname) AS AuthorName, 
                NULL AS Description, 
                NULL AS Reason, 
                NULL AS Suggestion, 
                NULL AS State, 
                'ata' as AtaTable , 
                NULL AS WeeklyReports,
                NULL AS Attachment,
                NULL AS articlesAdditionalWorkFromia, 
                NULL AS enabledAccounts, 
                NULL AS DefaultWeeklyReports, 
                NULL AS articlesMaterialFromia, 
                NULL AS articlesOtherFromia,
                NULL AS WeeklyReportsMomentsPerWeek,
                a.becomeFastFromOtherType,
                ia.ataComment, 
                 ia.Type, 
                 ia.AtaNumber, 
                 ia.DeviationNumber, 
                 ia.ProjectID, 
                 ia.Name, 
                 ia.StartDate, 
                 ia.DueDate,
                 ia.RevisionDate, 
                 ia.Status, 
                 ia.Ata, 
                 ia.Deviation, 
                 ia.Locked, 
                 ia.PaymentType, 
                 ia.BecomeExternalAtaFromInternal,
                 ia.Author, 
                 ia.AtaType, 
                 ia.DeviationType,
                 ia.PDFUrl, 
                 ia.street, 
                 ia.city, 
                 ia.zip, 
                 ia.briefDescription, 
                 ia.ConfirmStatus, 
                 ia.Token, 
                 ia.ParentAta, 
                 ia.EmailSent, 
                 ia.ClientComment, 
                 ia.AnswerEmail, 
                 ia.AnswerTime, 
                 ia.UserID, 
                 ia.FromFortnox,
                 ia.ForFortnox,
                 ia.client_answer_attachment, 
                 debitform.Name as paymentTypeName,
                 CONCAT(CONCAT(users.Surname, ' '),users.Lastname) AS AuthorName,
                 ia.Description, 
                 ia.Reason, 
                 ia.Suggestion, 
                 ia.State, 
                 'ata_become_external' as AtaTable,
                 ia.WeeklyReports, 
                 ia.Documents AS Attachment, 
                 ia.articlesAdditionalWork AS articlesAdditionalWorkFromia, 
                 ia.enabledAccounts, 
                 ia.DefaultWeeklyReports, 
                 ia.articlesMaterial AS articlesMaterialFromia, 
                 ia.articlesOther AS articlesOtherFromia, 
                 ia.WeeklyReportsMomentsPerWeek,
                 NULL AS becomeFastFromOtherType
FROM 
                  ata a
LEFT JOIN
                  users
INNER JOIN       internal_atas ia 
ON               (a.ATAID = ia.ATAID AND a.Author = users.UserID)
LEFT JOIN
                 debitform
ON
                  debitform.Id = a.PaymentType
WHERE 
                 
                  a.ATAID = 2095 
OR                ia.ATAID IS NULL
                 
OR 
                 a.ParentAta = 0  OR  ia.ParentAta = 0
GROUP BY         a.ATAID  



      
  

ATAID — это столбец, который существует в таблице ata

a.ATAID

   2117
  2118
  2119
  2120
  2121
  2122
  2123
  

Также AtaID из другой таблицы, которая называется internal_atas

 ATAID
no rows selected
  

Когда я запускаю запрос, я получаю сообщение об ошибке

 ORA-00904: "A"."ATAID": invalid identifier
  

Эта строка кода выдает ошибку

 ON               a.ATAID = ia.ATAID
  

Я пытаюсь изменить эти две части и сделать инверсию, подобную

 ON ia.ATAID = a.ATAID
  

Но все еще есть та же проблема.

Что здесь не так? Чего мне не хватает?

Определение таблицы:

 internal_atas

ANSWEREMAIL VARCHAR2(255 CHAR)
ANSWERTIME  TIMESTAMP(6)
ARTICLESADDITIONALWORK  CLOB
ARTICLESMATERIAL    CLOB
ARTICLESOTHER   CLOB
ATA NUMBER(10,0)
ATABECOMEEXTERNALID NUMBER(10,0)
ATACOMMENT  CLOB
ATAID   NUMBER(10,0)
ATANUMBER   NUMBER(10,0)
ATATYPE VARCHAR2(255 CHAR)
AUTHOR  VARCHAR2(255 CHAR)
BECOMEEXTERNALATAFROMINTERNAL   NUMBER(10,0)
BRIEFDESCRIPTION    CLOB
CITY    VARCHAR2(255 CHAR)
CLIENT_ANSWER_ATTACHMENT    VARCHAR2(255 CHAR)
CLIENTCOMMENT   VARCHAR2(255 CHAR)
CONFIRMSTATUS   NUMBER(10,0)
DEFAULTWEEKLYREPORTS    CLOB
DESCRIPTION CLOB
DEVIATION   NUMBER(10,0)
DEVIATIONNUMBER VARCHAR2(255 CHAR)
DEVIATIONTYPE   VARCHAR2(255 CHAR)
DOCUMENTS   CLOB
DUEDATE DATE
EMAILSENT   NUMBER(10,0)
ENABLEDACCOUNTS CLOB
EXTERNALATANUMBER   VARCHAR2(50 CHAR)
FORFORTNOX  NUMBER(10,0)
FROMFORTNOX NUMBER(10,0)
INTERNALATANUMBER   VARCHAR2(50 CHAR)
IS_DELETED  NUMBER(10,0)
LOCKED  NUMBER(10,0)
NAME    VARCHAR2(255 CHAR)
PARENTATA   NUMBER(10,0)
PAYMENTTYPE VARCHAR2(255 CHAR)
PDFURL  CLOB
PROJECTID   NUMBER(10,0)
QUANTITY    VARCHAR2(255 CHAR)
REASON  VARCHAR2(255 CHAR)
REVISIONDATE    VARCHAR2(50 CHAR)
STARTDATE   DATE
STATE   CLOB
STATUS  NUMBER(10,0)
STREET  VARCHAR2(255 CHAR)
SUGGESTION  VARCHAR2(255 CHAR)
TOKEN   VARCHAR2(255 CHAR)
TYPE    VARCHAR2(255 CHAR)
UNIT    VARCHAR2(255 CHAR)
USERID  NUMBER(10,0)
WEEKLYREPORTS   CLOB
WEEKLYREPORTSMOMENTSPERWEEK CLOB



ATA


ANSWEREMAIL VARCHAR2(255 CHAR)
ANSWERTIME  VARCHAR2(255 CHAR)
ATA NUMBER(10,0)
ATACOMMENT  CLOB
ATAID   NUMBER(10,0)
ATAINTERNALNUMBER   VARCHAR2(50 CHAR)
ATANUMBER   VARCHAR2(50 CHAR)
ATATYPE VARCHAR2(255 CHAR)
AUTHOR  VARCHAR2(255 CHAR)
BECOMEATAFROMDEVIATION  NUMBER(10,0)
BECOMEEXTERNALATAFROMINTERNAL   NUMBER(10,0)
BECOMEFASTFROMOTHERTYPE NUMBER(10,0)
BRIEFDESCRIPTION    VARCHAR2(255 CHAR)
CITY    VARCHAR2(255 CHAR)
CLIENT_ANSWER_ATTACHMENT    VARCHAR2(255 CHAR)
CLIENTCOMMENT   VARCHAR2(255 CHAR)
CONFIRMSTATUS   NUMBER(10,0)
CREATED_AT  DATE
DEVIATION   NUMBER(10,0)
DEVIATIONNUMBER VARCHAR2(50 CHAR)
DEVIATIONTYPE   VARCHAR2(255 CHAR)
DUEDATE DATE
EMAILSENT   NUMBER(10,0)
FINANCEID   NUMBER(10,0)
FORFORTNOX  NUMBER(10,0)
FROMFORTNOX NUMBER(10,0)
IS_DELETED  NUMBER(10,0)
LOCKED  CHAR(1 CHAR)
NAME    VARCHAR2(255 CHAR)
PARENTATA   NUMBER(10,0)
PAYMENTTYPE NUMBER(10,0)
PDFURL  VARCHAR2(255 CHAR)
PROJECTID   NUMBER(10,0)
QUANTITY    VARCHAR2(50 CHAR)
REASON  VARCHAR2(50 CHAR)
REVISIONDATE    DATE
STARTDATE   DATE
STATUS  NUMBER(10,0)
STREET  VARCHAR2(255 CHAR)
SUGGESTION  VARCHAR2(50 CHAR)
TOKEN   VARCHAR2(255 CHAR)
TYPE    VARCHAR2(255 CHAR)
UNIT    VARCHAR2(50 CHAR)
  

Поскольку таблица internal_atas пуста, поэтому у меня нет никаких данных только в таблице ata, у меня есть данные что-то вроде

Извините за отдельный, но у меня более 30 столбцов в таблице

 ANSWEREMAIL        ANSWERTIME            ATA   ATACOMMENT  ATAID    ATAINTERNALNUMBER  ATANUMBER    ATATYPE   AUTHOR  BECOMEATAFROMDEVIATION  BECOMEEXTERNALATAFROMINTERNAL     BECOMEFASTFROMOTHERTYPE    BRIEFDESCRIPTION    CITY     
email@email.com    2020-05-04 12:05:18   1      NULL        2036    NULL                3            1        197       0                       0                                   0                       some text here      Zagreb
  

ЧАСТЬ II таблица ATA

 CLIENT_ANSWER_ATTACHMENT    CONFIRMSTATUS    CREATED_AT         DEVIATION   DEVIATIONTYPE   DUEDATE         EMAILSENT  FINANCEID        FORFORTNOX      FROMFORTNOX     IS_DELETED  LOCKED  NAME         PARENTATA   PAYMENTTYPE
NULL                            1             10-JUN-20             3           1           06-APR-20        1          173                 1           0                0          0       fffttt          0         1
  

ЧАСТЬ III

 PDFURL          PROJECTID    QUANTITY  REASON   REVISIONDATE    STARTDATE      STATUS     STREET             SUGGESTION      TOKEN                        TYPE    UNIT      USERID      ZIP
someurl.com     261             NULL   NULL         NULL         STARTDATE      2          FoxBox 111         NULL           32aacd4b76628feeece6          1       NULL      NULL       2624
  

Комментарии:

1. Это утверждение SQL неверно, у вас есть 2 запроса подряд, и во втором запросе вы указали 2 раза ON , что может быть основной причиной вашей проблемы. Может быть, вы хотите это: ON (a.ATAID = ia.ATAID AND a.Author = users.UserID) . Если нет, отредактируйте свой вопрос и добавьте реальный SQL-запрос.

2. Не могли бы вы опубликовать описания таблиц? В SQL * Plus запустите, например, DESC ata . Кстати, это: OR ia.ATAID = NULL неверно; должно быть OR ia.ATAID IS NULL

3. @Littlefoot У меня нет описания таблиц, у меня есть только столбец, который является описанием, если вы имеете в виду.

4. ORA-00904 обычно означает, что используемый вами столбец не существует в этой таблице. Если кто-то создал его с использованием двойных кавычек (например, create table ata("ataid" number) , тогда вам нужно ссылаться на него точно так же каждый раз, когда вы его используете, например select "ataid" from ata . Как вы сказали, вы «видите» столбец, возможно, это так, но я не могу сказать, не вижу ли я описание таблицы.

5. Пожалуйста, дайте мне немного, я пока обновлю свой вопрос. Все, что я меняю, но все еще есть проблема

Ответ №1:

В вашем запросе есть структурная проблема, то есть он написан неправильно. У вас есть структурный элемент:

 select ...
FROM 
                  ata a
LEFT JOIN
                  users
INNER JOIN       internal_atas ia 
ON               (a.ATAID = ia.ATAID AND a.Author = users.UserID)
... 
  

Это недопустимо, поскольку оно переводится в форму «из соединения b в соединение c на … на …», где синтаксис соединения требует формы «из соединения b на … присоединяйтесь к c на …». Итак, вам нужно что-то вроде:

 select ...         
  from  ata a
  left join  users  on  a.author = users.userid
  inner join internal_atas ia on  a.ataid = ia.ataid
  ...
  

Я полагаю, что это то, на что ссылается @ThomasG war.
Я несколько удивлен конкретным сообщением об ошибке, которое вы получаете. Когда я попробовал ваш запрос, я получил «ORA-00905: отсутствует ключевое слово», но я уже давно пришел к выводу, что, когда запрос содержит структурно недопустимое, вы можете просто проигнорировать конкретное сообщение об ошибке (в этот момент Oracle «просто угадывает») и исправить запрос, а затем повторить попытку.

Кстати. У вас также есть несоответствие в вашем запросе:

 ON               (a.ATAID = ia.ATAID AND a.Author = users.UserID)
WHERE        
                  a.ATAID = 2095 
OR                ia.ATAID IS NULL
  

Любая строка, которая удовлетворяет ON (a.ATAID = ia.Условие ATAID) также не может удовлетворять OR (ia.ATAID РАВНО НУЛЮ). И поскольку он ДОЛЖЕН удовлетворять условию ON, условие OR is является излишним. Если он не изменен при исправлении структурного элемента.

Предположение:
Возможно, существует правдоподобное объяснение вашей ошибки. Согласно документации Oracle

Чтобы выполнить объединение трех или более таблиц, Oracle сначала объединяет две таблицы на основе условий объединения, сравнивая их столбцы, а затем присоединяет результат к другой таблице на основе условий объединения, содержащих столбцы объединенных таблиц и новой таблицы. Oracle продолжает этот процесс до тех пор, пока все таблицы не будут объединены в результат. Оптимизатор определяет порядок, в котором Oracle объединяет таблицы, на основе условий объединения, индексов в таблицах и любой доступной статистики для таблиц. На этом этапе синтаксического анализа, возможно, он пытается оценить

 users
    INNER JOIN       internal_atas ia 
    ON               (a.ATAID = ia.ATAID AND a.Author = users.UserID)
  

В этот момент таблица ata не является частью оценки, и, следовательно, столбец не определен. Как я уже сказал, это «просто предположение с моей стороны», но, похоже, оно соответствует доказательствам.

Комментарии:

1. Большое вам спасибо! Я решаю проблему! Теперь это работает 🙂