【问题标题】:Oracle right outer joinOracle 右外连接
【发布时间】: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'

问候, -阿南德

【问题讨论】:

    标签: oracle outer-join


    【解决方案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”代码的记录。你能告诉我我们做到了吗?
    • 上面的查询应该满足你的要求。如果没有,可能会发布示例数据和所需的输出。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 2010-09-26
    • 2014-02-24
    • 2013-09-15
    • 1970-01-01
    • 2015-01-11
    • 2019-08-30
    • 2012-11-07
    相关资源
    最近更新 更多