我有一个数据库,用于记录客户的所有订单。我想要做的不是获得每个客户的所有订单,而是客户与我们订购的最新订单。我已经通过使用Sub-Select语句来做到这一点,但由于有多少数据,它需要很多时间来检索。所以我想知道是否还有另外一种方法可以加快速度呢?
以下是我编写的Sub-Select语句的代码:
SELECT Customer.CustomerId,
Customer.Firstname + ' ' + Customer.Surname AS [Customer Name],
(SELECT TOP(1) Orders.OrderId
FROM Orders
WHERE Orders.CustomerId = Customer.CustomerId
ORDER BY Orders.OrderId DESC),
(SELECT TOP(1) Orders.Item
FROM Orders
WHERE Orders.CustomerId = Customer.CustomerId
ORDER BY Orders.OrderId DESC)
FROM Customer
非常感谢任何帮助或有关如何改进此信息的信息。
由于
答案 0 :(得分:0)
试试这个:
SELECT T1.CustomerID,T1.OrderID,T2.OrderItem
FROM
(SELECT C.CustomerID,MAX(O.OrderID) as OrderID
FROM Customer C JOIN
Orders O ON C.CustomerID=O.CustomerID
GROUP BY C.CustomerID) T1
JOIN
(SELECT OrderID,Item
FROM Orders) T2 ON T1.OrderID=T2.OrderID
SQL Fiddle中的示例结果。
答案 1 :(得分:0)
如果创建了索引,则重建/刷新索引,这将有助于提高查询的性能。
尝试创建非群集索引,这将加快查询的执行速度。
答案 2 :(得分:0)
可能对你有帮助
WITH cte AS (
SELECT c.CustomerName,
c.OrderID,
ROW_NUMBER() OVER(PARTITION BY c.CustomerName
ORDER BY c.CustomerName DESC) AS rk
FROM Customers c
join Orders j c.OrderID = j.OrderId
)
SELECT a.*
FROM cte a
WHERE a.rk = 1
答案 3 :(得分:0)
有时候使用row_number会得到更好的结果,所以你可以尝试这样的事情:
select * from (
SELECT
C.CustomerId,
C.Firstname + ' ' + C.Surname AS [Customer Name],
O.OrderId,
O.Item,
row_number() over (partition by O.CustomerId order by O.OrderId desc) as RN
FROM
Customer C
join Orders O on O.CustomerId = O.CustomerId
) X
where RN = 1
如果有很多订单和客户,这也可能很慢,因为没有搜索条件。您还应该检查索引,尤其是Orders.CustomerId。
没试过,所以希望没有语法错误:)