迭代行可能是"缺少"

时间:2015-10-12 12:26:55

标签: sql sql-server

我有一个包含多行的表,其中有一列用于对这些行进行排序。然后我有一个过期的列和一个数据列:

|ordering|  expired |  data  |
------------------------------
|    1   |2020-12-31|whatever|
|    2   |2020-12-31|whatever|
|    3   |2020-12-31|whatever|
|    4   |2010-01-01|whatever|
|    5   |2020-12-31|whatever|

我还有一张表格,其中包含我上次获得的行号:

|number|
|------|
|   2  |

我得到那个数字并加1以获得我需要的下一行。然后我检查该数字是否高于rowcount,如果是,则返回1。我将新行存储回数字,以便下次需要一行时可以使用它。

这是完美的工作,除了我过期的结果过滤。在上面的示例中,将不会选择第4行。因此,当我得到order = 4的行时,结果将为空。当然很容易修复 - 如果我得到一个空的结果,我可以尝试下一个值。如果存在大量过期行,则需要额外的时间和大量的额外时间。

如果我以前遇到的一行恰好在两次通话之间过期,我还需要注意我不会松开一行。

当行不断变化时,迭代行的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

运行查询两次可能是最好的方法。但是,您也可以订购所有结果,从数字后面的第一个值开始,包围:

order by (case when t1.ordering > t2.number then 1 else 2 end),
         t1.ordering

如果你有10行,那么这很好。如果您有10,000,则会产生排序所有数据的开销,并且两个查询可能更快。

答案 1 :(得分:0)

您可以使用$('#table1 tbody').sortable({ revert: true, start: function(event, ui) { // get row number, such as (row) 1 }, stop: function(event, ui) { // get row number, such as (row) 3 }}); 执行查询:

Min(ordering)

如果SELECT @nextOrderingNum = Coalesce(Min(t1.ordering), 0) FROM table1 t1 WHERE t1.expired > GETDATE() AND t1.ordering > @prevOrderingNum; 为0设置@nextOrderingNum = @prevOrderingNum并再次运行。

编辑,甚至更好,而不是只运行两次,只需向@nextOrderingNum添加子查询:

Coalesce