就像标题说的那样,我尝试执行SELECT语句,在该语句中我选择1条特定记录(该人搜索的一条记录),但我还想获得5条记录(特定记录之前和之后的5条记录)到特定搜索记录的左右两边,同时将当前/重点记录保留在搜索记录上。
记录ID(它们在其中搜索)由日期值和数字组成。例如,在本月中,第一个创建的记录如下所示1602030001
<-- Year(16), month (02), day (03) and first record (0001)
。因此,他们将在本月创建的第二个1602030002
以此类推。
因此,如果他们搜索记录16020050(二月的第50条记录),我想显示记录16020044至16020055。
我已经做了类似的事情,但是它有一个缺点:获取搜索记录(16020050),然后在VBA中将max和min变量(int)设置为搜索记录号的-5和+ 5。然后使用这些变量执行SELECT,例如:
SELECT * FROM SearchRecord WHERE ID > MinVariable (16020044) AND ID < MaxVariable (16020055)
但是,这样做的缺点是,例如,当2月只有500条记录,因此16020500然后开始进行(16030001),并且该人正在搜索2月的500条记录时,它还会搜索不存在的记录(到505,而3月份已经有5个-> 16030005)。
我不知道一种更有效/更智能的方式来将这5条额外记录移到每一边,并且还保持逻辑,即如果您在特定月份中搜索最后一条记录,则右边的5条记录将从下个月开始。
我希望这是有道理的;)
对于名为[MyTable]的表
ID
--------
16020493
16020494
16020495
16020496
16020497
16020498
16020499
16020500
16030001
16030002
16030003
16030004
16030005
16030006
16030007
我们可以使用查询获取以ID = 16020500为中心的范围的起始ID
SELECT MIN(ID) AS StartID
FROM
(
SELECT TOP 6 ID
FROM MyTable
WHERE ID <= 16020500
ORDER BY ID DESC
)
哪个返回
StartID
--------
16020495
并且我们可以简单地将该查询用作查询的WHERE子句中的子查询,以返回11行(前5行+主行+后5行):
SELECT TOP 11 *
FROM MyTable
WHERE
ID >= (
SELECT MIN(ID) AS StartID
FROM
(
SELECT TOP 6 ID
FROM MyTable
WHERE ID <= 16020500
ORDER BY ID DESC
)
)
ORDER BY ID
返回
ID
--------
16020495
16020496
16020497
16020498
16020499
16020500
16030001
16030002
16030003
16030004
16030005
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句