具有恒定值的Oracle(+)运算符

时间:2018-07-18 06:09:46

标签: 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;

对于他的(+)运算符,我有些困惑。据我所知,(+)OUTER JOIN的快捷方式,具体取决于放置在哪一侧,它表示LEFTRIGHT OUTER JOIN

但是在上面的查询中,左外部联接具有某个常量值,而不具有任何其他表ID。这是什么意思? PostgreSQL中类似的东西是什么?

也许这个问题可以推广,但是我不理解常量值的含义。

2 个答案:

答案 0 :(得分:5)

类似于以下内容:

select *
from t1
  left outer join p2 on t1.psn_id  = p2.psn_id and p2.pat_att_id = 48;

因此本质上是“过滤的外部联接”,其中仅表的行的子集被联接。

如果从(+)中删除了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;

有些不同。


这是另一个很好的示例,为什么不再使用(+)运算符了(甚至Oracle建议)。

答案 1 :(得分:0)

因此,转换后的最终查询在PostgreSQL中将是这样。我认为“ =”运算符是内部联接。如果我错了请纠正我

 SELECT k.psn_id, COALESCE(k.psn_name_lang, k.psn_name_kurz) psn_name, c.cli_code, c.cli_id, c.cli_cmp_id, ka2.pat_value cli_domain
              FROM table_krn_prs k
           inner join tbl_PERSON_atr p1 on k.psn_id = p1.pat_psn_id and p1.pat_att_id = 3
           inner join table_cli c on p1.pat_value = to_char(c.cli_cmp_id)
           left outer join tbl_PERSON_atr p2 on k.psn_id = p2.pat_psn_id and p2.pat_att_id = 48
           where p2.pat_value = i_domain and c.cli_cmp_id = i_cmp_id