2011-01-11 117 views
0

我已经继承了一个已删除记录的数据库。我正在制作一个新闻项目表。这意味着这些记录已经被删除了一些缺少的ID。 您可以打开档案中的任何新闻报道(1000年),然后使用下一个和上一个按钮浏览所有新闻报道。目前,如果您导航到已删除的下一条记录,则会引发记录集文件结尾,并显示默认消息“新闻项不再可用”。 有没有办法检测到这个缺失的记录,并移动到下一个有效的新闻报道(ID等)?我正在使用旧的ASP为这个网站,有没有办法检测到这一点,而导航通过一个记录集或这种类型的功能必须来自数据库,也许触发?谢谢你的帮助。选择记录,如果不存在(已删除) - 选择下一个有效记录

+0

如果您使用的是数字ID识别这些项目,以及一个和下一个按钮,简单地加上或减去一个,并不意味着说,如果项目没有按3不存在,所以它打开第2项,上一个按钮将再次链接到第2项?目前这项工作如何? – Rob 2011-01-11 12:06:19

回答

1

对于SQL Server 2005及更高版本,请参阅MSDN

您可以使用row_number来创建一个连续数字列。

0

1)既然你知道它会影响前端(你的'记录集文件结束'),当然你可以手动增加/减少标识符,并尝试从数据库中获取另一条记录,这似乎是你最好的可以不用进入数据库。但是,如果连续多条记录丢失,这可能非常不利。我建议改变数据库中的代码。

假设你有一个像这样的查询:

SELECT * FROM News WHERE [email protected] 

其中@Id是你想获取标识符。相反,你会有这样的事情:

SELECT * FROM News WHERE Id=(SELECT MIN(Id) FROM News WHERE Id>[email protected]) 

这将允许您选择第一个可用的记录。您应该使用MAX而不是MIN,如果您要查找'previous'消息,则应该使用MAX而不是> =,上面的示例应该适用于下一个消息。

而且不要忘了,使用这种方法,你将不得不增加基于价值的一个/上一个记录/递减标识符从数据库,而不是说你正在寻找牵强。例如:你的SQL表中有以下标识符 - 1,5,12,21。您已经打开Id = 1的新闻项目。 '下一步'按钮将开始寻找Id> = 2,并将返回Id = 5的记录。当你打开它时,你的'下一步'按钮应该查找Id> = 6(不是2)的记录。

下一个问题是,你必须提供记录的不仅是标识您要获取,而且方向中寻找。而且这个参数也应该在http查询字符串中传递。

而且,这种方法可能不是很人性化的,因为有以下网址将会显示同一项目的所有页面:
网站/ news.asp ID = 2 &方向=下一个
网站/ news.asp标识? = 3 &方向=下一个
网站/ news.asp?ID = 4 &方向=下一个
网站/ news.asp?编号= 5 &方向=下一

2)因此,也许它会更加用户当你显示c时,友好地确定下一个和上一个记录是哪一个urrent纪录。在这种情况下,你将不得不这样执行查询:

SELECT (SELECT MAX(Id) FROM News WHERE Id<@Id) as previousId, (SELECT MIN(Id) FROM News WHERE Id>@Id) as nextId 

,然后相应地更新你的“下一步” &“上一个”按钮的URL。因此,如果在前面的示例中我们将打开Id = 5的新闻项目,那么'上一个'按钮将直接导航到Id = 1,'Next'按钮将导航到Id = 12。

我相信第二种方法在你的情况下更好,因为它可以用较少的变化来实现,它也允许你实现灰色'Next'&'Previous'链接,如果相应的记录不可用(你会知道这个通过查询为previousId或nextId返回NULL)。

希望这有助于:)

3
SELECT TOP 1 * 
FROM news 
WHERE id >= @next_id 
ORDER BY 
     id