具有常量值的 Oracle (+) 运算符
Oracle (+) Operator with constant value
考虑以下 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
。
但是在上面的查询中,左外连接是一些常量值,而不是任何其他 table ID。这是什么意思? PostgreSQL 中类似的东西是什么?
也许这个问题可以概括,但我不明白常数值的含义。
它类似于这样的东西:
select *
from t1
left outer join p2 on t1.psn_id = p2.psn_id and p2.pat_att_id = 48;
所以本质上是一个 "filtered outer join",其中只有 table 的行的子集被连接起来。
如果从 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 也建议这样做)。
所以我在转换后的最终查询在 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
考虑以下 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
。
但是在上面的查询中,左外连接是一些常量值,而不是任何其他 table ID。这是什么意思? PostgreSQL 中类似的东西是什么?
也许这个问题可以概括,但我不明白常数值的含义。
它类似于这样的东西:
select *
from t1
left outer join p2 on t1.psn_id = p2.psn_id and p2.pat_att_id = 48;
所以本质上是一个 "filtered outer join",其中只有 table 的行的子集被连接起来。
如果从 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 也建议这样做)。
所以我在转换后的最终查询在 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