我有一张表,用于存储客户销售(在期刊上,如报纸上)数据。产品按问题存储。实施例
custid prodid issue qty datesold 1 123 2 12 01052008 2 234 1 5 01022008 1 123 1 5 01012008 2 444 2 3 02052008
如何针对特定客户检索(以更快的方式)所有产品的最后一期问题?我可以为SQL Server 2000和2005提供样本吗?请注意,该表超过500k行。
由于
答案 0 :(得分:3)
通用SQL; SQL Server的语法应该没有太大区别:
SELECT prodid, max(issue) FROM sales WHERE custid = ? GROUP BY prodid;
答案 1 :(得分:3)
假设“最新”是由日期(而不是发行号)决定的,这个方法通常很快,假设有不错的索引:
SELECT
T1.prodid,
T1.issue
FROM
Sales T1
LEFT OUTER JOIN dbo.Sales T2 ON
T2.custid = T1.custid AND
T2.prodid = T1.prodid AND
T2.datesold > T1.datesold
WHERE
T1.custid = @custid AND
T2.custid IS NULL
处理500k行是笔记本电脑可以毫无问题地处理的事情,更不用说真正的服务器了,所以我不会为了“性能”而对数据库进行非规范化处理。不要通过跟踪其他地方的“最后一次售出”来增加额外的维护,不准确和最重要的麻烦。
编辑:我忘了提及......这并不是专门处理两个问题具有相同确切日期的情况。您可能需要根据您针对该情况的业务规则进行调整。答案 2 :(得分:1)
这是一个新项目吗?如果是这样,我会谨慎地设置这样的数据库并阅读一些关于规范化的内容,以便最终得到类似的内容:
CustID LastName FirstName
------ -------- ---------
1 Woman Test
2 Man Test
ProdID ProdName
------ --------
123 NY Times
234 Boston Globe
ProdID IssueID PublishDate
------ ------- -----------
123 1 12/05/2008
123 2 12/06/2008
CustID OrderID OrderDate
------ ------- ---------
1 1 12/04/2008
OrderID ProdID IssueID Quantity
------- ------ ------- --------
1 123 1 5
2 123 2 12
我必须更好地了解你的数据库才能想出更好的架构,但这听起来好像你在平板桌上构建了太多东西,这将导致很多问题。
答案 3 :(得分:1)
如果您正在寻找按日期销售的最新产品,那么这就是您所需要的:
SELECT prodid, issue
FROM Sales
WHERE custid = @custid
AND datesold = SELECT MAX(datesold)
FROM Sales s
WHERE s.prodid = Sales.prodid
AND s.issue = Sales.issue
AND s.custid = @custid
答案 4 :(得分:0)
查询现有的成长历史表太慢了!
强烈建议您创建一个新表tblCustomerSalesLatest,它存储每个客户的最后一期数据。并从那里选择。