我有一个名为INV的表,其中包含如下记录:
ID | PROD | WH | BRAND
200 | 0100760 | 01 | ABC
100 | 010-1750 | 02 | DEF
300 | 010-1750 | 01 | SAM
4 | 1555 | 01 | SAM
我正在尝试使用SQL(存储过程)转到数据库表中的下一条记录。
当前我的sql是这样写的:
SELECT TOP 1 INV.*
FROM INV
WHERE INV.PROD > @prod
ORDER BY PROD ASC
使用上述sql,当@prod
为0100760时,它将转到下一条记录,其prod值为010-1750,wh值为02
当我使用上面的sql时,但是当@prod
为010-1750时,它将转到prod值为1555的下一条记录。
我想将我的sql语句更改为这样的内容(我不确定):
SELECT TOP 1 INV.*
FROM INV
WHERE
IF (INV.PROD = @prod)
INV.PROD = @prod
AND INV.WH <> @wh
ELSE
INV.PROD > @prod
ORDER BY PROD ASC
我认为我需要在SQL查询中使用CASE,但是我不确定如何使用。我不能使用ORDER BY ID。
让我们说我是ID为200的记录。运行存储过程时,它应该转到ID为100的记录。当我为ID 100的记录时,它应该转到ID为300的记录>
答案 0 :(得分:1)
进行原始查询。添加@wh以便区分大小写,并将新的ID标准添加到排序依据:
SELECT TOP 1 INV.*
FROM INV
WHERE INV.PROD > @prod or (INV.PROD=@prod and INV.WH > @wh)
ORDER BY PROD ASC,ID ASC
浏览所有评论后,我认为每种prod-wh组合都是唯一的,因此我将它们视为“要扫描的钥匙”。由于萨希尔(Sahil)的观察,我将答案的原始INV.WH <> @wh
更改为INV.WH > @wh
。但是请注意,如果某些行的prod和wh都相同,则将无法使用。
答案 1 :(得分:1)
您可以找到表中记录的位置,然后获取下一条记录。歧义性的主要点是列表在其记录中具有部分排序,而不是全部排序。如果我们根据(prod,id)列对记录进行排序,则只有总排序。
查看下面的代码是否有效。
SELECT TOP 1 INV.*
FROM INV
WHERE INV.PROD > @prod
OR (
INV.PROD=@prod
AND INV.ID > (SELECT ID FROM INV WHERE PROD + @prod AND WH = @wh)
)
答案 2 :(得分:0)
以下是可能适合您的示例代码,您可以根据需要使用。使用列NextRecordID和PreviousID来获取递归中的下一条记录。
CREATE TABLE #Temp
(
ID INT,
PROD VARCHAR(100),
WH VARCHAR(10),
BRAND VARCHAR(100)
)
INSERT INTO #Temp
SELECT 200,'0100760','01','ABC' UNION
SELECT 100,'010-1750','02','DEF' UNION
SELECT 300,'010-1750','01','SAM' UNION
SELECT 4,'1555','01','SAM'
SELECT * FROM #Temp
SELECT
CASE
WHEN
LEAD(ID) OVER (PARTITION BY 1 ORDER BY ID) IS NULL THEN -1
ELSE
LEAD(ID) OVER (PARTITION BY 1 ORDER BY ID) END AS NextRecordID,
CASE
WHEN
LAG(ID) OVER (PARTITION BY 1 ORDER BY ID) IS NULL THEN -1
ELSE
LAG(ID) OVER (PARTITION BY 1 ORDER BY ID ) END AS PreviousID,
*
FROM
#Temp
ORDER BY
ID
这是输出