Oracle 右外连接

Posted

技术标签:

【中文标题】Oracle 右外连接【英文标题】:Oracle right outer join 【发布时间】:2011-05-17 16:12:24 【问题描述】:

我有一个 oracle sql,我在其中执行帐户表和付款表之间的外部联接。我想知道仅当付款表中有匹配记录时如何执行条件 p.payment_status_code = 'R' 。其余的,不应该执行条件。

FROM
accounts a, payments p
WHERE (a.account_balance <= a.low_balance_level OR a.account_balance <= 0)
AND a.account_id = p.account_id(+)
AND p.payment_status_code = 'R'

问候, -阿南德

【问题讨论】:

【参考方案1】:
FROM
accounts a, payments p
WHERE (a.account_balance <= a.low_balance_level OR a.account_balance <= 0)
AND a.account_id = p.account_id(+)

AND p.payment_status_code(+) = 'R'
                         ^^^ 

【讨论】:

舒里克-谢谢。我们如何使用您建议的方法检查多个值?例如AND p.payment_status_code(+) IN ('R', 'O') 不起作用【参考方案2】:

如果我理解正确,您只想用payment_status_code = 'R' 显示结果,对吗?在那种情况下,为什么需要使用外部联接?你可以只使用传统的连接。你想做什么?

FROM
accounts a, payments p
WHERE (a.account_balance <= a.low_balance_level OR a.account_balance <= 0)
AND a.account_id = p.account_id
AND p.payment_status_code = 'R'

如果您想显示帐户信息,即使对于那些没有付款的人,您也可以使用左外连接而不是右外连接

FROM
accounts a
left join payments p on a.account_id = p.account_id AND p.payment_status_code = 'R'
WHERE (a.account_balance <= a.low_balance_level OR a.account_balance <= 0)

【讨论】:

嗨 jmsia - 即使没有付款,我也想显示帐户信息,即使没有付款信息,我使用的外部连接也会给我​​帐户信息。【参考方案3】:
FROM
accounts a, payments p
WHERE (a.account_balance <= a.low_balance_level OR a.account_balance <= 0)
AND a.account_id = p.account_id(+)
AND (p.account_id is null or p.payment_status_code = 'R')

【讨论】:

RedFilter - 感谢您的快速回复。实际上 payment_status_code 也可以有空值,我只想要那些带有“R”代码的记录。你能告诉我我们做到了吗? 上面的查询应该满足你的要求。如果没有,可能会发布示例数据和所需的输出。

以上是关于Oracle 右外连接的主要内容,如果未能解决你的问题,请参考以下文章

左外连接与右外连接区别?

数据库连接

深入理解关系中的外连接,左外连接,右外连接

何时或为啥要使用右外连接而不是左连接?

oracle数据库外连接

数据库的内连接外连接(左外连接右外连接全外连接)以及交叉连接(转)