只要大小总和为100,我将创建一个sql语句来检索所有图像
我有这个:
SELECT PhotoNr
INTO # PhotoTabl
FROM Photo
WHERE Size <= 100????
ORDER BY PhotoOrder ASC
表-内容:
PhotoNr ...... Size
1 ............ 20
2 ............ 50
3 ............ 20
4 ............ 50
5 ............ 20
sql将给出结果:
PhotoNr ...... Size
1 ............ 20
2 ............ 50
3 ............ 20
对此有什么好的解决方案吗?
答案 0 :(得分:3)
有很多方法可以给这只猫上皮。最好的将取决于您可以使用的是什么,以及尺寸等所施加的限制
一种选择是使用递归CTE(这个简单的例子假设连续的光子值,如果需要可以允许非连续):
;WITH CTE as (
select PhotoNr, Size, Tot = Size
from photos where photonr = 1
union all
select p.PhotoNr, p.Size, Tot = cte.Tot +p.Size
from CTE
join photos p on CTE.PhotoNr + 1 = p.photonr
)
select photonr, size from cte
where tot < 100
或者,一种非常简单的方式(代码)(但可能不那么高效)可以使用cross apply
:
select
photonr,
size
from photos p
cross apply (
select tot = sum(size) from photos sub
where sub.photonr <= p.photonr) x
where tot <= 100
答案 1 :(得分:3)
如果您使用的是SQL Server 2012+,则会有一个包含PhotoNr
的键列{1}}的索引,并且预期返回的行数相对于该行中的行数较小。表
Size
答案 2 :(得分:0)
正如@MartinSmith
在评论中所说,你只需计算一个运行总计。有很多方法,它取决于你的RDBMS,你可以利用什么来提高效率等。一个基本但非常低效的方式就是这样。
WITH cte AS
(
SELECT p1.id, p1.size, SUM(p2.size) running_total
FROM photos p1, photos p2
WHERE p1.id >= p2.id
GROUP BY p1.id, p1.size
)
SELECT id, size
FROM cte
WHERE running_total <= 100
有一篇有趣的文章比较了创建一个总计here
的方法