sql - 使 OR 查询更加简化

标签 sql sql-server tsql

我正在尝试按 customerType 进行搜索,但遇到了一个小问题:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip FROM qrySearchFields 
WHERE  CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 241)

运行时间不到一秒,因此:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip FROM qrySearchFields 
WHERE CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 240)

但是当我尝试使用 OR 来同时查找两种类型时:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip FROM qrySearchFields WHERE
CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 241) 
Or CustomerID in (Select CustomerID from tblCustomerTypeLineItems Where CustomerTypeID = 240)

大约需要 40 秒。

是否有更好的方法来做到这一点,或者我缺少什么?
有关更多背景信息,请参阅父问题:Displaying Query Results Horizontally

最佳答案

为什么不按如下方式重构您的 OR 查询:

SELECT DISTINCT CustomerID, CustomerName, City, State, Zip 
  FROM qrySearchFields 
 WHERE CustomerID IN (SELECT CustomerID 
                        FROM tblCustomerTypeLineItems 
                       WHERE CustomerTypeID IN (241, 240))

如果您使用的是 SQL Server 2005 及更高版本,则可以使用公用表表达式 (CTE):

WITH cteCustomerId AS 
(
    SELECT CustomerID
      FROM tblCustomerTypeLineItems
     WHERE CustomerTypeID IN (241, 240)
)
SELECT DISTINCT CustomerID, CustomerName, City, State, Zip
  FROM qrySearchFields
 WHERE CustomerID IN (SELECT CustomerID
                        FROM cteCustomerId);

关于sql - 使 OR 查询更加简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658774/

相关文章:

sql - 按月按组获取数据集的百分位数

sql - 我想编写一个汇总查询并将结果显示在一个表中

mysql - 在 MySQL 中容纳所有 session 所需的最少 session 室数量

sql - STRING_AGG 不是可识别的内置函数名称

sql - 工作停止日期为空意味着什么?

sql - ADO 命令参数未传递到存储过程或存储过程 'Ignoring' 参数

sql-server-2008 - t sql在单个表上进行多次更新

mysql - 是否可以在 MySQL 中循环获取销售数据?

sql - 使用 SQLAlchemy 过滤 sql count(*)

mysql - 使用 MySQL 计算曾经在线的大多数用户