带有 ORA-00936 的 SQL 查询实例:缺少表达式错误

Posted

技术标签:

【中文标题】带有 ORA-00936 的 SQL 查询实例:缺少表达式错误【英文标题】:An Instance of SQL query with ORA-00936: missing expression error 【发布时间】:2018-11-16 15:57:17 【问题描述】:

我现在正在学习 SQL 和 Oracle 数据库。我有一个关于我要在查询中写什么的简短示例。假设我想创建一个表,其中包含按降序排列的所有员工的名字,这些员工要么是工程师,要么是经理。保留两个 (或更多)记录,如果两个(或更多)员工的名字相同。这就是我现在所拥有的,但不知道为什么它会显示 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;

这里是表 Employee、Engineer 和 Manager 的定义:

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
);

【问题讨论】:

您是想创建一个表(它永久存储在您的数据库中)还是一个查询(它向您显示结果,但不存储它们)。如果您的意思是查询,请省略“CREATE TABLE Example AS”。 是的,我想创建一个表格来存储和显示结果。不仅仅是一个选择查询。 您不应该过分依赖 order by - Oracle 会按照自己的意愿存储它。由于这是一个新表,因此行将按照您指定的顺序存储作为一种副作用,但是如果您要在这里和那里删除一些行并使用另一个 order by 添加更多行,则无法保证您的顺序是什么' 会在您查询时看到它。此外,varchar2 是标准字符串类型 - char 很少是一个好的选择,因为我怀疑你想要的空白填充行为。 【参考方案1】:

这里是查询:

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;

【讨论】:

【参考方案2】:

在我看来,您似乎认为您的代码会被解释为这样(注意额外的括号):

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) 是一个布尔表达式(它有一个真/假值),但 (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;

【讨论】:

以上是关于带有 ORA-00936 的 SQL 查询实例:缺少表达式错误的主要内容,如果未能解决你的问题,请参考以下文章

查询返回 ORA-00936: 缺少表达式

多维数据集 SQL ORA-00936 缺少表达式

通过 java 类运行时出现 ORA-00936 错误

什么可能导致 ORA-00936 - 缺少以下 sql 的表达式?

ORA-00936 在 oracle 选择语句中使用日期函数时

ORA-06550:第 12 行,第 9 列:PL/SQL:ORA-00936:缺少表达式 ORA-06550:第 9 行,第 5 列:PL/SQL:忽略 SQL 语句