00936. 00000 - «отсутствует выражение» при создании представления - PullRequest
0 голосов
/ 10 декабря 2018

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

Отчет об ошибке -ORA-00936: пропущенное выражение00936. 00000 - «пропущенное выражение»* Причина:* Действие:

Сценарий:

CREATE OR REPLACE VIEW mainUser.studentData_view
(
    StudentID,
    StudentName,
    StudentDOB,
    StudentSubjectID,
    SubjectName,
    LastUpdated)

AS
    SELECT student.StudentID,
           student.StudentName,
           student.StudentDOB,
           student.StudentSubjectID,
           subject.SubjectName,
           audit.SYSTIMESTAMP
    FROM   mainuser.studentdata student,
           mainuser.studentdatachanges audit,
           mainuser.subjectdata subject
    WHERE  student.StudentSubjectID = subject.SubjectID
           AND AUD.systimestamp = (SELECT Max(SYSTIMESTAMP)
                                   FROM   mainuser.studentdatachanges AUD2
                                   WHERE  AUD2.NEW_StudentID = AUD.new_studentid);

1 Ответ

0 голосов
/ 10 декабря 2018

Вы должны использовать явный синтаксис объединения (JOIN ключевые слова), это все проясняет.Ваш запрос с явными объединениями выглядит следующим образом:

SELECT ... --Removed to shorten query
FROM mainUser.studentData student
JOIN mainUser.studentDataChanges audit --Missing join predicate
JOIN mainUser.subjectData subject ON student.StudentSubjectID = subject.SubjectID
WHERE AUD.SYSTIMESTAMP = (SELECT MAX(SYSTIMESTAMP) 
                          FROM mainUser.studentDataChanges AUD2 
                          WHERE AUD2.NEW_StudentID = AUD.NEW_StudentID);

Здесь следует отметить несколько вещей:

  • studentDataChanges имеет псевдоним audit, а затем упоминается как AUD.Необходимо выбрать один из двух
  • studentDataChanges отсутствует предикат объединения (может быть AUD.StudentID = student.StudentID?)

Это будет выглядеть примерно так:

SELECT ...
FROM mainUser.studentData student
JOIN mainUser.studentDataChanges AUD ON AUD.StudentID = student.StudentID 
JOIN mainUser.subjectData subject ON student.StudentSubjectID = subject.SubjectID
WHERE AUD.SYSTIMESTAMP = (SELECT MAX(SYSTIMESTAMP) 
                          FROM mainUser.studentDataChanges AUD2 
                          WHERE AUD2.NEW_StudentID = AUD.NEW_StudentID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...