使用加号(+)转换Oracle的连接语法到标准连接语法

时间:2013-01-30 17:30:24

标签: sql oracle oracle10g oracle11g

我试图了解使用(+)连接两个表的Oracle连接语法。 有人可以告诉我,如果转换为使用标准连接语法,该查询将会是什么样子?

select p1.product_id, p1.product_name, p2.product_code, (decode(p3.product_type, null, 'N/A',p3.product_type) as product_type
from products p1, product_descriptions p2, product_descriptions p3
where p1.product_id=p2.product_id
and p2.product_age=p3.product_age(+)
and p2.product_type=p3.product_type(+)
and p3.status(+)='VALID'

1 个答案:

答案 0 :(得分:5)

这样的事情:

select p1.product_id, p1.product_name, p2.product_code,
    (decode(p3.product_type, null, 'N/A', p3.product_type) as product_type
from products p1
join product_descriptions p2
    on p1.product_id = p2.product_id
left join product_descriptions p3
    on p3.product_age = p2.product_age
    and p3.product_type = p2.product_type
    and p3.status = 'VALID';

where p1.product_id=p2.product_idp1p2之间的正常内部联接。其他是外连接;它的编写方式看起来像是左外连接和右外连接的混合,但由于and p2.product_age=p3.product_age(+)and p3.product_age(+)=p2.product_age相同,所以它不是真的;它是p1 / p2加入和p3的产品之间相当简单的左外连接。

顺便说一句,我不喜欢像p1p2p3这样的别名,因为它们不具有描述性,当你这样做时很容易迷失方向更复杂的查询。 I'm not alone

我不确定你甚至需要外连接,但它取决于数据。如果product_ageproduct_type是唯一的,那么您可以case p2.status;如果不是那么你可能假设只有一个product_age / product_type行可以VALID,否则你会得到重复。只是思考你想要做的事情......