我试图了解使用(+)连接两个表的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'
答案 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_id
是p1
和p2
之间的正常内部联接。其他是外连接;它的编写方式看起来像是左外连接和右外连接的混合,但由于and p2.product_age=p3.product_age(+)
与and p3.product_age(+)=p2.product_age
相同,所以它不是真的;它是p1
/ p2
加入和p3
的产品之间相当简单的左外连接。
顺便说一句,我不喜欢像p1
,p2
和p3
这样的别名,因为它们不具有描述性,当你这样做时很容易迷失方向更复杂的查询。 I'm not alone
我不确定你甚至需要外连接,但它取决于数据。如果product_age
和product_type
是唯一的,那么您可以case
p2.status
;如果不是那么你可能假设只有一个product_age
/ product_type
行可以VALID
,否则你会得到重复。只是思考你想要做的事情......