检查子查询结果中是否有任何值

use*_*844 8 sql-server cte sql-server-2008-r2 subquery

我有一个复杂的子查询,它返回一个订单 ID 列表。我需要得到一份有这些订单的客户名单。问题是有两种方法可以将客户分配给订单(两个字段之一)。我可以做这样的事情:

 select *
 from Customers
 where orderId in (select...) 
 or secondaryOrderId in (select ...)
Run Code Online (Sandbox Code Playgroud)

问题是子查询是巨大的,无论是执行时间还是屏幕空间。有没有办法检查其中一个字段是否包含所需的结果之一?

Rob*_*ley 10

尝试:

where exists (select * .... 
        where Customers.orderId = ... 
        or Customers.secondaryId = ...
     )
Run Code Online (Sandbox Code Playgroud)

例如,如果您打算:

where orderId in (select value from ...)
or secondaryorderid in (select value from ...)
Run Code Online (Sandbox Code Playgroud)

然后你让它只调用你的子查询一次,并在其中构建你的 OR 子句。

 where exists (select * from ... 
        where Customers.orderId = value 
        or Customers.secondaryOrderId = value
     )
Run Code Online (Sandbox Code Playgroud)

这样做的重点是确保复杂的子查询只执行一次。CTE 或用两个 EXISTS 替换两个 IN 不会发生这种情况。