查询的含义是什么?

时间:2015-06-10 06:48:57

标签: sql database

GUYS我知道(+)意味着加入

SELECT *
FROM email a,email_types b
WHERE a.user_id  (+)     =10
  AND a.email_id(+)=b.email_enum;

SELECT *
FROM email a,email_types b
WHERE a.user_id      =10
  AND a.email_id(+)=b.email_enum;

a.user_id (+) = 10的含义是什么?这等于a.user_id =10,还是有不同的含义?

两个查询之间有什么区别?

a.user_id (+) =10与哪个列b匹配。值10与b表的列?

匹配

3 个答案:

答案 0 :(得分:2)

(+)语法是Oracle旧的,过时的隐式外连接语法。 (+)的一方是可能没有匹配项的一方,因此此查询将返回ba a.user_id = 10所在位置null的所有记录,或{ {1}}如果没有匹配的a记录,则为{1}}。

答案 1 :(得分:0)

第一个连接条件中的(+)是必需的,以确保将连接视为外部连接,如Oracle docs中所述:

  

如果A和B通过多个连接条件连接,则必须在所有这些条件下使用(+)运算符。如果不这样做,那么Oracle数据库将仅返回由简单连接产生的行,但没有警告或错误,建议您没有外连接的结果。

这里需要注意的关键是,在每个连接条件中没有(+),你将得到内连接的结果,而不是外连接。

答案 2 :(得分:0)

最好通过将Oracle语法转换为标准SQL来解释:

SELECT *
FROM email a,email_types b
WHERE a.user_id  (+)     =10
  AND a.email_id(+)=b.email_enum;

相当于:

SELECT *
FROM email_types b
  LEFT JOIN email a ON a.email_id = b.email_enum AND a.user_id = 10;

这意味着"在email_types和电子邮件之间进行外部联接,但只考虑email表中user_id等于10"的行。如果没有该用户的电子邮件,它将返回email_types的所有行以及user_id = 10的所有匹配电子邮件(如果有的话),则不会考虑email表中的行。

如果您从(+)列的原始查询条件中删除user_id运算符,则相当于:

SELECT *
FROM email_types b
  LEFT JOIN email a
         ON a.email_id = b.email_enum 
WHERE a.user_id = 10;

由于外连接表上的条件而导致内连接。