根据行中的值,使用值更新SQL行的最快方法是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据行中的值,使用值更新SQL行的最快方法是什么?相关的知识,希望对你有一定的参考价值。
我在table
中有以下SQL Server
,名为tblProducts
:
+-----------+--------------+-------------+
| pkProduct | fkProductID | intIssue |
+-----------+--------------+-------------+
| 1 | 10 | 1 |
| 2 | 10 | 2 |
| 3 | 10 | 4 |
| 4 | 11 | 1 |
| 5 | 11 | 2 |
| 6 | 11 | 3 |
| 7 | 11 | 5 |
| 8 | 12 | 1 |
| 9 | 13 | 1 |
| 10 | 13 | 4 |
| 11 | 14 | 1 |
| 12 | 14 | 3 |
| 13 | 14 | 6 |
| 14 | 15 | 1 |
| 15 | 16 | 1 |
+-----------+--------------+-------------+
随着时间的推移,由于任何原因删除行,现在问题数量存在差距。我希望问题编号按顺序运行,以便table
看起来像这样:
+-----------+--------------+-------------+
| pkProduct | fkProductID | intIssue |
+-----------+--------------+-------------+
| 1 | 10 | 1 |
| 2 | 10 | 2 |
| 3 | 10 | 3 |
| 4 | 11 | 1 |
| 5 | 11 | 2 |
| 6 | 11 | 3 |
| 7 | 11 | 4 |
| 8 | 12 | 1 |
| 9 | 13 | 1 |
| 10 | 13 | 2 |
| 11 | 14 | 1 |
| 12 | 14 | 2 |
| 13 | 14 | 3 |
| 14 | 15 | 1 |
| 15 | 16 | 1 |
+-----------+--------------+-------------+
目前我已将table
添加到我的DataSet
并在vb.net
代码中使用此更新行:
Dim currentProductsTable As tblProductsDataTable
Using taProduct As New tblProductsTableAdapter
currentProductsTable = taProduct.GetData
End Using
Dim issueCounter As Integer = 1
Dim previousRow As tblProductsRow = Nothing
Using con As SqlConnection = New SqlConnection(My.Settings.MyConnectionString)
Using cmd As New SqlCommand("UPDATE dbo.tblProducts SET [intIssue] = @issueCounter WHERE pkProduct = @ProductID", con)
cmd.Connection = con
con.Open()
For Each row As tblProductsRow In currentProductsTable.Rows
If Not previousRow Is Nothing Then
If row.fkProductID = previousRow.fkProductID Then
cmd.Parameters.Clear()
cmd.Parameters.Add("@issueCounter", SqlDbType.Int).Value = issueCounter
cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = row.pkProduct
previousRow = row
Else
issueCounter = 1
cmd.Parameters.Clear()
cmd.Parameters.Add("@issueCounter", SqlDbType.Int).Value = issueCounter
cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = row.pkProduct
previousRow = row
End If
Else
issueCounter = 1
cmd.Parameters.Clear()
cmd.Parameters.Add("@issueCounter", SqlDbType.Int).Value = issueCounter
cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = row.pkProduct
previousRow = row
End If
cmd.ExecuteNonQuery()
issueCounter += 1
Next
End Using
End Using
我已经通过.GetData
和fkProductID ASC
订购了intIssue ASC
,但是需要很长时间,因为在rows
有大约30000个table
。
我想知道是否有更快的方法来进行这种更新?
答案
我猜你正在使用SQL Server。如果是这样,您可以在一个查询中执行此操作:
with toupdate as (
select p.*,
row_number() over (partition by fkProductID order by pkProduct) as new_intIssue
from dbo.tblProducts p
)
update toupdate
set intIssue = new_intIssue
where intIssue <> new_intIssue;
以上是关于根据行中的值,使用值更新SQL行的最快方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas - 使用 .apply() 根据条件更新行中的值