#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. Большое вам спасибо! Я решаю проблему! Теперь это работает 🙂