使用 t-sql 更新单行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2909118/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Update a single row with t-sql
提问by dan_vitch
I want to update a row in my date base. The problem is, through a mistake on my part, I have two identical rows of data. How do I run the update on just one row?
我想更新我的日期库中的一行。问题是,由于我的错误,我有两行相同的数据。如何仅在一行上运行更新?
采纳答案by Bill Paetzke
Often tables have a unique ID. And you should filter on that.
通常表有一个唯一的 ID。你应该对此进行过滤。
For example,
例如,
UPDATE YourTable
SET YourColumnToUpdate = 'your_value'
WHERE YourUniqueColumn = @Id
If your table does not have a unique ID, consider adding one: an integer
column with a Primary Key
and Identity
.
如果您的表没有唯一 ID,请考虑添加一个:integer
带有Primary Key
和的列Identity
。
回答by spender
In SQL Server 2005+, you can use
在 SQL Server 2005+ 中,您可以使用
UPDATE TOP (1) ....
The advantage of this over SET ROWCOUNT
is that any triggers will not be subject to a ROWCOUNT
limit, which is almost certainly a good thing.
这样做的好处SET ROWCOUNT
是任何触发器都不会受到ROWCOUNT
限制,这几乎肯定是一件好事。
回答by RandyMorris
I suggest you go back and normalize your database. At the very least add a auto increment int primary key column and use that id. Using UPDATE TOP 1 might work and directly answers your question, but non - normalization of your database is the "real" problem.
我建议你回去规范化你的数据库。至少添加一个自动增量 int 主键列并使用该 ID。使用 UPDATE TOP 1 可能会起作用并直接回答您的问题,但数据库的非规范化是“真正的”问题。
回答by tgr
-- 01. create the table for the test-data
CREATE TABLE dbo.Orders (
ID INTEGER
,Value DECIMAL(10, 2)
,Descr NVARCHAR(100)
,BookingDate DATETIME
,UserName NVARCHAR(100)
,CountMeasure INTEGER
)
-- 02. save the timestamp for the inserts
DECLARE @date AS DATETIME
SET @date = getdate()
-- 03. inserting test-data
INSERT INTO dbo.Orders VALUES (1,499.99,'Notebook',@date,'tgr',0)
INSERT INTO dbo.Orders VALUES (2,650.00,'PC',@date,'tgr',0)
INSERT INTO dbo.Orders VALUES (3,29.50,'Keyboard',@date,'tgr',0)
-- 04. adding the duplicate entry
INSERT INTO dbo.Orders VALUES (2,650.00,'PC',@date,'tgr',0)
-- 05. viewing the 4 Rows
SELECT * FROM dbo.Orders
-- 06. viewing the distinct 3 Rows
SELECT DISTINCT * FROM dbo.Orders
/* You don't want to delete the duplicate row, but you want to count
the distinct IDs using SUM on the CountMeasure-Column */
-- 07. alternativ solution (which may does not fit your requirements)
/* So your result shoud be the same like this */
SELECT COUNT(DISTINCT ID) as DistinctCount
FROM dbo.Orders
-- 08. Understanding the solution
/* To understand the solution we take a look on the main-part
We generate for each ID a Row-Number ordered by random
Details: https://msdn.microsoft.com/de-de/library/ms186734%28v=sql.120%29.aspx */
SELECT * , ROW_NUMBER() OVER (PARTITION BY ID ORDER BY NEWID()) AS RowNumberForEachId
FROM dbo.Orders
-- 09. The update statement
/* We use this part to update our table */
UPDATE a
SET CountMeasure = 1
FROM (-- Orders incl
SELECT * , ROW_NUMBER() OVER (PARTITION BY ID ORDER BY NEWID()) as rowNum
FROM dbo.Orders
) as a
WHERE rowNum = 1
-- 10. Viewing the Result
SELECT * FROM dbo.Orders
-- 11. Comparing Count(DISTINCT ...) with the SUM(...) alternative
SELECT COUNT(DISTINCT ID) as countDistinct, SUM(CountMeasure) as sumCountMeasure
FROM dbo.Orders
-- 12. Removing the test-table
DROP TABLE dbo.Orders
回答by Ryan Anderson
Use SET ROWCOUNT;
使用 SET ROWCOUNT;
SET ROWCOUNT 1; UPDATE Production.ProductInventory SET Quantity = 400 WHERE Quantity < 300; GO
设置行数 1; UPDATE Production.ProductInventory SET Quantity = 400 WHERE Quantity < 300; 走