使用存储过程中查询中项目的索引位置更新列

Posted

技术标签:

【中文标题】使用存储过程中查询中项目的索引位置更新列【英文标题】:Update column with index position of item in query in stored procedure 【发布时间】:2020-06-21 18:33:59 【问题描述】:

我想使用它所在位置的索引以特定顺序更新游戏查询。我想为此使用 SP 而不是代码,因为我不想发送 1000 个 SQL 更新查询,而是在 SP 中使用来更新它们。

下面是我想要的一些伪代码。我需要索引参数是游戏在 order by/where 子句中的位置。基本上,当天的第一场比赛将是索引 1,依此类推。

UPDATE Games
Set GameId = 'G' + Index
WHERE EventId = 100
ORDER BY Date, Time

以下是执行该查询后的示例表。请注意前两个是第二天,因此为什么它的数字比前一天的第二行大,与时间相同。

游戏桌

Date          Time       GameId      EventId
6/22/2020     9:00 AM    G6          100
6/21/2020     8:00 AM    G2          100
6/21/2020     7:00 AM    G1          100
6/21/2020     9:00 AM    G3          100
6/21/2020     10:00 AM   G4          100
6/22/2020     8:00 AM    G5          100

【问题讨论】:

你能用一些示例数据解释更多吗? 检查here 聪明人,我试试看是否有效 “G5”的索引为“5”,但它是当天的第一场比赛。这与您的解释不一致。 我不知道你在说什么,G5是第5场比赛,所以它会是G5。 【参考方案1】:

您可以使用row_number() 生成索引。在 SQL Server 中会为此推荐一个可更新的 cte:查询要短得多,并且不需要连接(这样可以避免第二次扫描):

with cte as (
    select gameId, concat('G', row_number() over(order by date, time)) newGameId
    from games
    where eventId = 100
)
update cte set gameId = newGameId

请注意,与+ 不同,concat() 强制使用字符串上下文,因此无需显式转换行号。

【讨论】:

很好,不知道你可以更新这样的 cte,它会更新一个实际的表【参考方案2】:

您可以使用带有 ROW_NUMBER 的 CTE,然后将其连接回您的表。这样就可以进行更新了。

WITH cte_rn 
as
(
    select [Date],[Time],[EventId],ROW_NUMBER() OVER (ORDER BY [Date],[Time]) as rn
    from [dbo].[Games]
)

UPDATE g1
SET [GameId] = 'G'+CAST(g2.rn AS VARCHAR(10))
FROM [dbo].[Games] g1
JOIN cte_rn g2
    ON g1.[Date] = g2.[Date] 
    AND g1.[Time] = g2.[Time] 
    AND g1.[EventId] = g2.[EventId] ;

【讨论】:

以上是关于使用存储过程中查询中项目的索引位置更新列的主要内容,如果未能解决你的问题,请参考以下文章

索引视图SQL优化以及数据库存储过程

MySQL之 索引 和 存储过程

动态sql存储过程更新查询问题?

部署后脚本中的执行过程-SSDT

存储过程、索引、视图、触发器 的区别

Mysql学习---视图/触发器/存储过程/函数/索引 180101