3

我正在尝试了解使用 (+) 连接两个表的 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'
4

1 回答 1

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正常内部连接。其他的是外连接;它的编写方式看起来像是左右外连接的混合,但因为与 then相同,所以它不是真的;这是/连接的乘积和.p1p2and p2.product_age=p3.product_age(+)and p3.product_age(+)=p2.product_agep1p2p3

顺便说一句,我不喜欢别名p1,因为它们不是描述性的,当您在更复杂的查询中执行此操作时很容易迷失方向。我并不孤单p2p3

我不确定您甚至是否需要外部联接,但这取决于数据。如果product_age并且product_type是唯一的,那么您可以case使用p2.status; 如果不是,那么您可能会假设只有一个product_age/product_type行可以VALID,否则您会得到重复。只是在思考你正在尝试做的事情......

于 2013-01-30T17:35:06.193 回答