我有以下查询,查找与订单相关的客户。我在客户上有遗留ID,因此我必须检查旧ID(遗留)和客户ID,因此或者声明
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和遗产的索引。
答案 0 :(得分:1)
对于表customer
,您需要在列oldid
和custid
上创建单独的索引。如果您已在custid
上拥有聚集索引,那么也会在oldid
上添加索引:
CREATE INDEX customer_oldid_idx ON customer(oldid);
如果没有此索引,请在此子句中搜索oldid
:
WHERE (po.CustID = c.OldID OR po.CustID = c.CustID)
必须使用全表扫描,这将是超慢的。