考虑以下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
的快捷方式,具体取决于放置在哪一侧,它表示LEFT
或RIGHT OUTER JOIN
。
但是在上面的查询中,左外部联接具有某个常量值,而不具有任何其他表ID。这是什么意思? PostgreSQL中类似的东西是什么?
也许这个问题可以推广,但是我不理解常量值的含义。
答案 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