OR约束的SQL语句中的条件列

And*_*yle 1 sql oracle

这个问题是关于SQL中的一般技术,我无法弄清楚如何最好地实现我目前对语言的理解.

请注意,这将针对Oracle运行,以防任何特定于供应商的功能特别有用,但我希望有一种很好的方法可以使用"纯"SQL执行此操作.

问题的简短版本:如果我对查询有一个OR条件,我检查我的"主"表A中的值是否对应于表B或表C中的值,有条件地修改的最佳方法是什么(例如,乘以)语句选择器,如果在表C中找到了值,但在表B中没有找到?

长版本(带示例):目前我有一个看起来大致相似的查询(它更复杂,但这是基本结构):

select o.value, /* other stuff... */
  from orders o,
       clients c
 where o.client = c.pkey
   and c.name = ?
Run Code Online (Sandbox Code Playgroud)

一切都很好.但是,现在想象一些客户可以代表其他客户行事 - 但由于处理费或某些逻辑交易以这种方式进行,并不完全具有其全部价值.所以有一个表managed_orders具有用于列order,client另一列(两主键将各表)和multiplier,作为表示应"通过进行"的顺序值的比例在0.0和1.0之间的浮点数.

正确 - 因此修改上述查询以显示由给定客户端拥有或由其他人管理的订单非常简单.但是,如果这是一个托管订单,我需要将o.value选择器乘以托管订单,但如果它是经典的直接订单,则不需要(或者等价地我们可以乘以1.0).multiplier

select o.value * m.multiplier /* Will not work in all cases */, /* other stuff... */
  from orders o,
       clients c,
       managed_orders m
 where (o.client = c.pkey or m.order = o.pkey)
   and c.name = ?
   and m.client = c.pkey
Run Code Online (Sandbox Code Playgroud)

如何最好地实现这种条件乘法?

Ton*_*ews 5

如果并非所有订单都有关联的managed_order,那么您需要使用外部联接.然后你可以处理没有这样的乘数:

select o.value * COALESCE(m.multiplier,1)
from orders o
left outer join managed_orders m on m.order = o.pkey
left outer join clients c on (o.client = c.pkey or m.client = c.pkey)
where c.name = ?
Run Code Online (Sandbox Code Playgroud)

COALESCE确保如果没有乘数,则使用常数1.