首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL Oracle LEFT JOIN和SUBQUERY错误: ORA-00905:缺少关键字

基础概念

LEFT JOIN:LEFT JOIN(左连接)是一种SQL连接操作,它返回左表(即LEFT JOIN关键字之前的表)的所有记录,以及右表中与左表匹配的记录。如果右表中没有匹配的记录,则结果集中右表的部分将包含NULL值。

SUBQUERY:子查询(SUBQUERY)是在SQL查询中嵌套的另一个查询。子查询可以出现在SELECT、FROM、WHERE和HAVING子句中,用于返回一个或多个值,这些值将被外部查询使用。

错误原因

ORA-00905错误表示SQL语句中缺少了某个关键字。在LEFT JOIN和SUBQUERY的组合使用中,可能的原因包括:

  1. 语法错误:子查询或连接语句的语法不正确。
  2. 关键字遗漏:在子查询或连接语句中遗漏了必要的关键字。

示例问题

假设我们有以下两个表:

代码语言:txt
复制
CREATE TABLE employees (
    employee_id NUMBER,
    first_name VARCHAR2(50),
    last_name VARCHAR2(50)
);

CREATE TABLE departments (
    department_id NUMBER,
    department_name VARCHAR2(50)
);

我们想要查询所有员工及其所属部门的信息,即使某些员工没有分配到任何部门。我们可以使用LEFT JOIN来实现:

代码语言:txt
复制
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

如果我们尝试在LEFT JOIN中使用子查询,并且出现了ORA-00905错误,可能是因为子查询的语法不正确。例如:

代码语言:txt
复制
SELECT e.employee_id, e.first_name, e.last_name, (
    SELECT d.department_name
    FROM departments d
    WHERE d.department_id = e.department_id
) AS department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

在这个例子中,子查询被错误地放在了SELECT子句中,而不是在JOIN条件中使用。

解决方法

  1. 检查语法:确保子查询和连接语句的语法正确。
  2. 关键字遗漏:检查是否遗漏了必要的关键字。

正确的做法是将子查询放在JOIN条件中:

代码语言:txt
复制
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN (
    SELECT department_id, department_name
    FROM departments
) d ON e.department_id = d.department_id;

参考链接

通过以上方法,可以解决ORA-00905错误,并正确使用LEFT JOIN和SUBQUERY。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

触类旁通:那些关于 TBL$OR$IDX$PART$NUM 的诡异案例知识

SQL详细信息。...原来出现问题的并不是用户SQL,而是在后台执行的一条递归SQL语句,这个数据库自身的SQL语句调用,因为缺少变量输入,而出现了 ORA-01008 错误: ----- Error Stack Dump...通过 TBL$OR$IDX$PART$NUM 关键字 ORA-1008 错误号,在 MOS 上很容易找到这个问题的相关BUG: Bug 17258090 Recursive SQL fails with...简单来说,就是Oracle在子分区级别执行子查询分区剪裁时,调用的内部递归SQL,因为缺少变量传入而出错,其解决方案是,禁用子查询谓词分区剪裁。...注意,以下查询是在 11.2.0.4 版本上的查询输出,我们可以清晰的看到每一条记录所属的对象分区: 故事四:来自 12.2 的未知 BUG 再请注意,当我们在 12.2 版本上执行这个SQL时,确触发了内部错误

1K40

SQL优化极简法则,还有谁不会?

以下法则适用于各种关系型数据库,包括但不限于:MySQL、OracleSQL Server、PostgreSQL 以及 SQLite 等。...以上示例在 Oracle SQL Server 中会自动执行子查询展开,两种写法效果相同;在 PostgreSQL 中与 MySQL 类似,第一个语句使用 Nested Loop Join,改写为...从逻辑上讲,SQL 语句的执行顺序如下: **首先,**FROM JOINSQL 语句执行的第一步。它们的逻辑结果是一个笛卡尔积,决定了接下来要操作的数据集。...如果存在 GROUP BY 子句或者 DISTINCT 关键字,只能使用分组字段聚合函数进行排序;否则,可以使用 FROM JOIN 表中的任何字段排序。...除此之外,理解 SQL 的逻辑执行顺序还可以帮助我们避免一些常见的错误,例如以下语句: -- 错误示例 SELECT emp_name AS empname FROM employee WHERE

1K20
  • SQL 优化极简法则,还有谁不会?

    以下法则适用于各种关系型数据库,包括但不限于:MySQL、OracleSQL Server、PostgreSQL 以及 SQLite 等。如果觉得文章有用,欢迎评论?、点赞?...以上示例在 Oracle SQL Server 中会自动执行子查询展开,两种写法效果相同;在 PostgreSQL 中与 MySQL 类似,第一个语句使用 Nested Loop Join,改写为...从逻辑上讲,SQL 语句的执行顺序如下: 首先,FROM JOINSQL 语句执行的第一步。它们的逻辑结果是一个笛卡尔积,决定了接下来要操作的数据集。...如果存在 GROUP BY 子句或者 DISTINCT 关键字,只能使用分组字段聚合函数进行排序;否则,可以使用 FROM JOIN 表中的任何字段排序; 最后,OFFSET FETCH(LIMIT...除此之外,理解 SQL 的逻辑执行顺序还可以帮助我们避免一些常见的错误,例如以下语句: -- 错误示例 SELECT emp_name AS empname FROM employee WHERE

    1.2K20

    SQL 优化极简法则,你掌握几个?

    以下法则适用于各种关系型数据库,包括但不限于:MySQL、OracleSQL Server、PostgreSQL 以及 SQLite 等。...以上示例在 Oracle SQL Server 中会自动执行子查询展开,两种写法效果相同;在 PostgreSQL 中与 MySQL 类似,第一个语句使用 Nested Loop Join,改写为...从逻辑上讲,SQL 语句的执行顺序如下: 首先,FROM JOINSQL 语句执行的第一步。它们的逻辑结果是一个笛卡尔积,决定了接下来要操作的数据集。...如果存在 GROUP BY 子句或者 DISTINCT 关键字,只能使用分组字段聚合函数进行排序;否则,可以使用 FROM JOIN 表中的任何字段排序; 最后,OFFSET FETCH(LIMIT...除此之外,理解 SQL 的逻辑执行顺序还可以帮助我们避免一些常见的错误,例如以下语句: -- 错误示例 SELECT emp_name AS empname   FROM employee  WHERE

    1.1K10

    ClickHouse使用姿势系列之分布式JOIN

    ClickHouse 的分布式JOIN查询可以分为两类,带GLOBAL关键字的,不带GLOBAL关键字的情况。 2.1 普通JOIN实现 2.1 中描述了GLOBAL JOIN的实现。...接下来看看无GLOBAL关键字JOIN如何实现的: initiator 将SQL S中左表分布式表替换为对应的本地表,形成S' initiator 将a.中的S'分发到集群每个节点 集群节点执行S',...则改SQL在分布式执行的时序为: initiator 收到查询请求 initiator 执行分布式查询,本节点其他节点执行SELECT a_.i, a_.s, b_.t FROM a_local AS...集群节点完成3)中SQL执行后,执行 SELECT a_.i, a_.s, b_.t FROM a_local AS a_ JOIN subquery as b_ ON a_.i = b_.i其中subquery...该SQL在集群范围内并行执行。汇总结果,记录为subquery

    1.3K40

    ClickHouse使用姿势系列之分布式JOIN

    ClickHouse 的分布式JOIN查询可以分为两类,带GLOBAL关键字的,不带GLOBAL关键字的情况。 2.1 普通JOIN实现 2.1 中描述了GLOBAL JOIN的实现。...接下来看看无GLOBAL关键字JOIN如何实现的: a. initiator 将SQL S中左表分布式表替换为对应的本地表,形成S' b. initiator 将a.中的S'分发到集群每个节点 c....2) initiator 执行分布式查询,本节点其他节点执行 3)集群节点收到2)中SQL后,分析出右表时分布式表,则触发一次分布式查询:SELECT b_.i, b_.t FROM b_local...该SQL在集群范围内并行执行。汇总结果,记录为subquery。...2) initiator 集群其他节点均执行 3)initiator 将2)中subquery发送到集群中其他节点,并触发分布式查询:SELECT a_.i, a_.s, b_.t FROM a_local

    4.9K233

    【TBase开源版测评】轻松愉快去O选项:TBase

    选型时主要考虑公司内部的HTAP类型数据库,因为需要其类似Oracle既能进行离线任务计算,也可以承担频繁的查询(其实是DAU只有100+的对内服务…),并且后续扩容还比较方便,范围内的选项有TiDB...2.2.2 任务迁移优化一例 目标语句是一个5个子表逐次left join,其中第t1表的目标分区大概30w行,t4表行数最多有3000w+行。原语句较长,详情见附录4。...禁用Nested Loop 其中t1t2部分的join就耗时3m56s。对这一部分进行explain。...=1 width=4156)" -> Nested Loop Left Join (cost=10.26..21.32 rows=1 width=4156) Join Filter...数据量最大的t4表也前置到第一次left join。最终这个任务从20min+甚至经常打满资源无法终止优化到20s左右。

    1.7K30

    【ClickHouse 极简教程】分布式下的 INJOIN 及 GLOBAL关键字

    GLOBAL 关键字 ClickHouse 的 HASH JOIN算法实现比较简单: 从right_table 读取该表全量数据,在内存中构建HASH MAP; 从left_table 分批读取数据,...当以集群模式提供服务时候,分布式JOIN查询就无法避免。这里的分布式JOIN通常指,JOIN查询中涉及到的left_table 与 right_table 是分布式表。...ClickHouse 的分布式JOIN查询可以分为两类,带GLOBAL关键字的,不带GLOBAL关键字的情况。 GLOBAL JOIN 实现 GLOBAL JOIN 计算过程如下: a....initiator 集群其他节点均执行 3)initiator 将2)中subquery发送到集群中其他节点,并触发分布式查询:SELECT a_.i, a_.s, b_.t FROM a_local...补充: 在使用GLOBAL关键字时,虽然最大限度的降低了查询放大,但是如果数据量过大,产生的临时表就会很大,也会受到网络稳定性网络带宽的限制。

    2.2K10

    SQL高级查询方法

    正文共:5024 字 2 图 预计阅读时间:14 分钟 本文目录: 4.8 子查询 subquery 4.9 联接 join 4.10 UNION运算符 4.11 EXCEPTINTERSECT半联接...WHERE [NOT] EXISTS (subquery) 许多包含子查询的 Transact-SQL 语句都可以改用联接表示。其他问题只能通过子查询提出。...由于必须返回单个值,所以由未修改的比较运算符(即后面未跟关键字 ANY 或 ALL 的运算符)引入的子查询不能包含 GROUP BY HAVING 子句。...在 FROM 子句中可以用下列某一组关键字来指定外部联接: LEFT JOINLEFT OUTER JOIN。...联接的例子可以参考笔试题中的例子,SQL笔试50题(上),SQL笔试50题(下),在笔试题中有大量的内联接左联接的例子。

    5.7K20

    SqlAlchemy 2.0 中文文档(五十九)

    参考资料:#10213 模式 [模式] [错误] 修改了仅对 Oracle 后端有效的 Identity.order 参数的渲染,该参数是 Sequence Identity 的一部分,不再对诸如...参考:#8800 [sql] [错误] 修复了关于渲染绑定参数位置有时身份的一系列问题,例如用于 SQLite、asyncpg、MySQL、Oracle 等的参数。...参考:#8748 sqlite [sqlite] [usecase] 添加了对 SQLite 后端反映“DEFERRABLE”“INITIALLY”关键字的支持,这些关键字可能存在于外键构造中...这是一个错误,因为像 SQLite Oracle 这样的 DBAPI 已经使用了非缓冲结果获取方案,仍然受益于部分结果获取的使用。...参考:#7612 SQL [SQL] [错误] 修复了由于字符串格式错误而导致值为元组的错误消息失败的问题,包括对不支持的文字值无效的布尔值的编译。

    14410
    领券