这个查询有效,但是有更好的方法来编写这个查询吗?目前的速度似乎很慢。该场景非常简单。
我有两个表:“客户”和“付款”。客户表包含您所期望的客户信息。付款表跟踪客户每月支付的款项。它有一些我们需要查看的字段 - DueDate、PaymentDate 和 CustomerID。
我想要的查询是我想要所有在前 12 次付款中至少迟到 3 个月的客户。我的查询如下,但似乎相当慢。有没有比我下面写的更好的方法?
SELECT CustomerID
FROM Customers AS C
WHERE EXISTS ( SELECT DueDate, CustomerID, PaymentDate
FROM ( SELECT TOP 12 *
FROM Payments as P
WHERE P.CustomerID = C.CustomerID
ORDER BY PaymentDate
) AS First12Payments
WHERE DATEDIFF(MONTH, First12Payments.DueDate, First12Payments.PaymentDate) > 3 )
谢谢!
最佳答案
嗯,Joe Enos 和 Brandon 的评论中的建议很棒。但是,如果您无法添加该列,则对 SQL 语句进行 2 个小更改可能会使其速度更快一些。为了使其更好,您可能需要向 Payments 表中的 DueDate 和 PaymentDate 列添加索引。
SELECT CustomerID
FROM Customers AS C
WHERE EXISTS ( SELECT 1 -- no need for a columns list since you only check for existance
FROM (SELECT TOP 12 DueDate, PaymentDate -- no need for all the columns, only the ones you use
FROM Payments as P
WHERE P.CustomerID = C.CustomerID
ORDER BY PaymentDate
) AS First12Payments
WHERE DATEDIFF(MONTH, First12Payments.DueDate, First12Payments.PaymentDate) > 3
关于SQL 查询优化,查看前 x 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213384/