1

我有以下查询来查找与订单相关的客户。我在客户上有一个旧 ID,因此我必须检查旧 ID(旧版)和客户 ID,因此使用 or 语句

SELECT  
   c.Title, 
   c.Name   
  FROM productOrder po   
      INNER JOIN Employee e ON po.BookedBy = e.ID
      CROSS APPLY (
      SELECT TOP 1 *
      FROM Customer c 
      WHERE(po.CustID = c.OldID OR po.CustID = c.CustID)    
      ) c

  GROUP BY     
  c.CustomerId, c.Title, c.FirstName, c.LastName

如果我删除该OR语句,它在这两种情况下都运行良好。有一个关于客户 ID 和遗产的索引。

4

1 回答 1

1

对于表customer,您需要在列oldidcustid. 如果您已经有聚集索引 on custid,那么也添加索引 on oldid

CREATE INDEX customer_oldid_idx ON customer(oldid);

如果没有此索引,请oldid在此子句中搜索:

 WHERE (po.CustID = c.OldID OR po.CustID = c.CustID)

将不得不使用全表扫描,这将非常慢。

于 2013-09-11T10:14:04.617 回答