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
表的列?
答案 0 :(得分:2)
(+)
语法是Oracle旧的,过时的隐式外连接语法。 (+)
的一方是可能没有匹配项的一方,因此此查询将返回b
与a
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;
由于外连接表上的条件而导致内连接。