具有常量值的Oracle(+)运算符

NET*_*eek 2 sql oracle outer-join

考虑以下Oracle查询:

SELECT psn_id, nvl(psn_name_lang, psn_name_kurz) psn_name, cli_code, cli_id, cli_cmp_id, p2.pat_value cli_domain
FROM tabl_psn_obj, table_cli, table_pat p1, table_pat p2
WHERE psn_id = p1.pat_psn_id
  AND p1.pat_value = to_char(cli_cmp_id)
  AND p1.pat_att_id = 3
  AND p2.pat_att_id(+) = 48 <---- what does this mean
  AND p2.pat_psn_id = psn_id
  AND p2.pat_value = i_domain
  AND cli_cmp_id = i_cmp_id;
Run Code Online (Sandbox Code Playgroud)

我对他的(+)操作员感到困惑.据我所知,这(+)是一个快捷方式OUTER JOIN,取决于你把它放在哪一侧,它表示一个LEFTRIGHT OUTER JOIN.

但在上面的查询中,左外连接具有一些常量值,而不是任何其他表ID.这是什么意思?PostgreSQL中的类似之处是什么?

也许这个问题可以概括,但我不理解具有恒定值的含义.

a_h*_*ame 5

它类似于这样的事情:

select *
from t1
  left outer join p2 on t1.psn_id  = p2.psn_id and p2.pat_att_id = 48;
Run Code Online (Sandbox Code Playgroud)

所以基本上是一个"过滤外连接",其中只有表的一部分行连接在一起.

如果(+)p2.pat_att_id(+) = 48查询中删除运算符将变为等效于:

select *
from t1
  left outer join p2 on t1.psn_id = p2.psn_id 
where p2.pat_att_id = 48;
Run Code Online (Sandbox Code Playgroud)

哪个是不同的.


这是另一个很好的例子,为什么(+)不再使用运算符(甚至Oracle推荐).