【问题标题】:Problems with query in SQL*PLUSSQL*PLUS 中的查询问题
【发布时间】:2013-10-01 14:57:11
【问题描述】:

当我在 sql*plus 中运行此查询时,我收到 ORA-00923(未在预期位置找到 FROM 关键字)错误。

SELECT EMPLOYEE_ID, FIRST_NAME||' '||LAST_NAME AS FULLNAME
FROM EMPLOYEES
WHERE (JOB_ID, DEPARTMENT_ID) 
IN (SELECT JOB_ID, DEPARTMENT_ID FROM JOB_HISTORY)
AND DEPARTMENT_ID=80; 

我在 sql developer 中运行了该查询,猜猜是什么,它没有任何问题,为什么我在 sql*plus 中尝试时收到此错误消息。

【问题讨论】:

  • 只是一个查询:你为什么在 where 子句中使用 DEPARTMENT_ID 两次?如果DEPARTMENT_ID 必须是80,您可以在内部查询中检索job_id 吗?
  • 在 SQL Plus 客户端中,您可以将查询拆分为多行以隔离问题。
  • 我知道但是,我只是在练习子查询主题。我没有与本书相同的数据库,因此我进行该查询以进行练习。 xDDDDD

标签: sql oracle sqlplus


【解决方案1】:
SELECT   EMPLOYEE_ID, FIRST_NAME || ' ' || LAST_NAME AS FULLNAME
  FROM   EMPLOYEES
 WHERE   JOB_ID IN (SELECT   JOB_ID
                      FROM   JOB_HISTORY
                     WHERE   DEPARTMENT_ID = 80);

SELECT   EMPLOYEE_ID, FIRST_NAME || ' ' || LAST_NAME AS FULLNAME
  FROM   EMPLOYEES
 WHERE   JOB_ID IN (SELECT   JOB_ID FROM JOB_HISTORY) AND DEPARTMENT_ID = 80;

SELECT   EMPLOYEE_ID, FIRST_NAME || ' ' || LAST_NAME AS FULLNAME
  FROM   EMPLOYEES E
 WHERE   EXISTS (SELECT   NULL
                   FROM   JOB_HISTORY J
                  WHERE   J.JOB_ID = E.JOB_ID)
         AND DEPARTMENT_ID = 80;

【讨论】:

  • 这比我的回答要好得多。 +1
【解决方案2】:

您的查询是完全有效的,并且完全可以在 sqlplus 中运行:

14:04:01 (41)HR@sandbox> l
  1  SELECT EMPLOYEE_ID, FIRST_NAME||' '||LAST_NAME AS FULLNAME
  2  FROM EMPLOYEES
  3  WHERE (JOB_ID, DEPARTMENT_ID)
  4  IN (SELECT JOB_ID, DEPARTMENT_ID FROM JOB_HISTORY)
  5* AND DEPARTMENT_ID=80
14:04:05 (41)HR@sandbox> /

34 rows selected.

Elapsed: 00:00:00.01

只有在出现语法错误时才会遇到 ORA-00923。像这样:

14:04:06 (41)HR@sandbox> ed
Wrote file S:\spool\sandbox\BUF_HR_41.sql

  1  SELECT EMPLOYEE_ID, FIRST_NAME||' '||LAST_NAME AS FULLNAME X
  2  FROM EMPLOYEES
  3  WHERE (JOB_ID, DEPARTMENT_ID)
  4  IN (SELECT JOB_ID, DEPARTMENT_ID FROM JOB_HISTORY)
  5* AND DEPARTMENT_ID=80
14:05:17 (41)HR@sandbox> /
SELECT EMPLOYEE_ID, FIRST_NAME||' '||LAST_NAME AS FULLNAME X
                                                           *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

您可能在将查询从 sqldeveloper 复制到 sqlplus 时创建了一个?您确定您的帖子包含确切的符号到符号,您实际上尝试执行的查询吗?我会更加关注查询文本和错误消息 - 它通常指向错误,例如我的示例中的 X 下的 *

【讨论】:

  • 感谢您的分析。也许这是我没有看到的语法错误,我再次运行查询并且它工作了。
【解决方案3】:

我不知道你想要达到什么目的,但这里有一个可能的解决方案:

/* Formatted on 10/1/2013 1:50:20 PM (QP5 v5.126.903.23003) */
SELECT   EMPLOYEE_ID, FIRST_NAME || ' ' || LAST_NAME AS FULLNAME
  FROM      EMPLOYEES EMP
         JOIN
            JOB_HISTORY JH
         ON EMP.JOB_ID = JH.JOB_ID AND EMP.DEPARTMENT_ID = JH.DEPARTMENT_ID
 WHERE   EMP.DEPARTMENT_ID = 80;

【讨论】:

  • "I don't know what you are trying to achieve but here's a possible solution" 让我笑了。没有冒犯,对不起)
  • @beherenow,这个问题本身确实缺乏对他真正想要达到的目标的解释。抱歉。=D
  • 只用子查询练习=)
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 2013-11-08
  • 2011-11-07
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多