Экземпляр SQL-запроса с ORA-00936: отсутствует ошибка выражения - PullRequest
0 голосов
/ 16 ноября 2018

Сейчас я учусь на SQL и Oracle Database. У меня есть короткий пример того, что я пытаюсь написать в запросе. Предположим, я хочу создать таблицу, которая содержит в порядке убывания всех имен сотрудников для инженеров или менеджеров. Оставь оба (или более) записей, если два (или более) сотрудников имеют одинаковые имена. Это то, что у меня есть сейчас, но не знаю, почему он показывает ORA-00936: ошибка пропущенного выражения при его выполнении. Может ли кто-нибудь помочь мне проверить это?

CREATE TABLE Example AS
    SELECT FNAME
    FROM Employee
    WHERE Employee.ID IN (SELECT ID FROM Engineer) OR (SELECT ID FROM Manager)
    ORDER BY FNAME DESC;

Вот определения таблицы Сотрудник, Инженер и Менеджер:

CREATE TABLE Employee(
    ID CHAR(10) PRIMARY KEY,
    SSN CHAR(15) NOT NULL,
    FNAME CHAR(15),
    LNAME CHAR(15),
    DOB DATE NOT NULL
);

    CREATE TABLE Manager(
    ID CHAR(10) PRIMARY KEY,
    HATERID CHAR(10),
    CONSTRAINT LMAN CHECK (HATERID != ID),
    FOREIGN KEY(ID) REFERENCES Employee(ID) ON DELETE CASCADE,
    FOREIGN KEY(HATERID) REFERENCES Manager(ID) ON DELETE CASCADE
);

CREATE TABLE Eng_tech(
    ID CHAR(10) PRIMARY KEY,
    FOREIGN KEY(ID) REFERENCES Employee(ID) ON DELETE CASCADE
);

CREATE TABLE Engineer(
    ID CHAR(10) PRIMARY KEY,
    FOREIGN KEY (ID) REFERENCES Eng_tech(ID) ON DELETE CASCADE
);

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Мне кажется, что вы думаете, что ваш код будет интерпретирован так (обратите внимание на дополнительные скобки):

CREATE TABLE Example AS
    SELECT FNAME
    FROM Employee
    WHERE Employee.ID IN ((SELECT ID FROM Engineer) OR (SELECT ID FROM Manager))
    ORDER BY FNAME DESC;

Однако на самом деле это было истолковано так:

CREATE TABLE Example AS
    SELECT FNAME
    FROM Employee
    WHERE (Employee.ID IN (SELECT ID FROM Engineer)) OR (SELECT ID FROM Manager)
    ORDER BY FNAME DESC;

OR используется для объединения двух условий (логических выражений). Employee.ID IN (SELECT ID FROM Engineer) - логическое выражение (имеет значение true / false), но (SELECT ID FROM Manager) - нет. Oracle немного запутался из-за вашего кода, потому что ожидал, что это выражение будет сравниваться с чем-то другим, но не нашел то, что искал.

Вы, вероятно, хотите вместо этого:

CREATE TABLE Example AS
    SELECT FNAME
    FROM Employee
    WHERE Employee.ID IN (SELECT ID FROM Engineer)
       OR Employee.ID IN (SELECT ID FROM Manager)
    ORDER BY FNAME DESC;

Вы также можете написать следующее, что в некоторой степени ближе к тому, что вы пытались:

CREATE TABLE Example AS
    SELECT FNAME
    FROM Employee
    WHERE Employee.ID IN (SELECT ID FROM Engineer UNION SELECT ID FROM Manager)
    ORDER BY FNAME DESC;
0 голосов
/ 16 ноября 2018

Вот запрос:

CREATE TABLE Example AS
    SELECT emp.FNAME
    FROM Employee Emp
    JOIN Engineer Eng
    ON Emp.ID=ENG.ID
    JOIN Manager Mgr
    ON Emp.ID=Mgr.ID
    ORDER BY emp.FNAME DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...