带有 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 在 oracle 选择语句中使用日期函数时
ORA-06550:第 12 行,第 9 列:PL/SQL:ORA-00936:缺少表达式 ORA-06550:第 9 行,第 5 列:PL/SQL:忽略 SQL 语句