【发布时间】:2014-04-15 06:16:36
【问题描述】:
问题是这样的:
考虑一个程序来管理每个客户的余额限制的银行账户
{table Customers, table Limits} 其中每个 Customer.id 都有一个限制记录
然后客户说要存储限制更改的历史记录,这不是问题,因为我已经有了Limit 的日期列,但是active/latest limits 的视图查询需要更改
之前:客户限制是 1 比 1,所以一个简单的选择就可以了
现在:它将显示所有限制的记录,这意味着每个客户有多个记录,我只需要最新的限制,所以我想到了类似这样的伪代码
foreach( id in Customers)
{
select top 1 *
from Limits
where Limits.customer_id = id
order by Limits.date
}
但在通过 SO 寻找类似问题时,我遇到了类似"95% of the time when you need a looping structure in tSQL you are probably doing it wrong"-JohnFx
和"SQL is primarily a set-orientated language - it's generally a bad idea to use a loop in it."-Mark Bannister
谁能确认/解释为什么循环是错误的?在上面解释的问题中,我需要循环什么错了?
提前致谢
更新:我的解决方案 根据 TomTom 的回答和建议的链接 here,在 Dean 友好地回答代码之前,我想出了这个
SELECT *
FROM Customers c
LEFT JOIN Limits a ON a.customer_id = c.id
AND a.date =
(
SELECT MAX(date)
FROM Limits z
WHERE z.customer_id = a.customer_id
)
我想我会分享:>
感谢您的回复,
快乐编码
【问题讨论】:
标签: sql sql-server sql-server-2012