我正在判断一些旧的SQL语句,以记录它们,并可能增强它们.

数据库管理系统是Oracle

我不明白这样一句话:

select ...
from a,b
where a.id=b.id(+)

我对(+)运营商感到困惑,在任何论坛上都找不到它...(在引号中搜索+也不起作用).

总之,我使用了SQLDeveloper的"解释计划",我得到了一个输出,说HASH JOIN, RIGHT OUTER,等等.

如果我在查询结束时删除(+)运算符,会有什么区别吗?在使用(+)之前,数据库是否必须满足某些条件(如有一些索引等)??如果你能给我提供一个简单的理解,或者一些好的链接,我可以从中了解到这一点,这将是非常有帮助的.

谢谢

推荐答案

这是特定于Oracle的外部联接表示法,因为ANSI-89格式(在FROM子句中使用逗号分隔表引用)没有标准化外部联接.

查询将以ANSI-92语法重新编写为:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

This link is pretty good at explaining the difference between JOINs


还应注意的是,尽管(+)有效,但Oracle recommends not using it:

Oracle建议您使用FROM子句OUTER JOIN语法,而不是Oracle join运算符.使用Oracle联接运算符(+)的外部联接查询受以下规则和限制的约束,这些规则和限制不适用于FROM子句OUTER JOIN语法:

Sql相关问答推荐

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

我希望以正确的升序获取SQL结果.怎样才能得到它们?

如何在PostgreSQL中对第1,1,1,1,2,2,2,2行进行编号

Django将字符串筛选为整数?

对多个条件的SQL进行排名

如何根据行状态设置正确的标志

明细表中没有记录如何更新主表的值为0

使用与JOIN一起使用的查询后进行分页和排序

从给定数据中查找下一个工作日期

SQL中相同表内的VLOOKUP等价

将二维数组的第一个和第二个元素取消嵌套到两个一维数组中

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

将一名成员金额分配给群组内的其他成员

根据不同日期标准分配组的逻辑

SQL日期比较用例;月初至今的报告

根据条件列出不同的值

在给定列中具有特定值的行与 SQL 中的总行数的比率

我现在如何显示重复的汽车? postgresql

如何使用子查询锁定此查询中的选定行?