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 不会发生这种情况。
| 归档时间: |
|
| 查看次数: |
40183 次 |
| 最近记录: |