Обновите одну строку с помощью t-sql
Я хочу обновить строку в моей базе данных. Проблема состоит в том, что с моей ошибкой ошибка состоит из двух одинаковых строк данных. Как запустить обновление только в одной строке?
Ответы
Ответ 1
Часто таблицы имеют уникальный идентификатор. И вы должны отфильтровать это.
Например,
UPDATE YourTable
SET YourColumnToUpdate = 'your_value'
WHERE YourUniqueColumn = @Id
Если ваша таблица не имеет уникального идентификатора, подумайте о том, чтобы добавить один: столбец integer
с Primary Key
и Identity
.
Ответ 2
В SQL Server 2005+ вы можете использовать
UPDATE TOP (1) ....
Преимущество этого над SET ROWCOUNT
заключается в том, что любые триггеры не будут подвергаться пределу ROWCOUNT
, что почти наверняка хорошо.
Ответ 3
Я предлагаю вам вернуться и нормализовать вашу базу данных. По крайней мере добавьте автоинкремент int primary key column и используйте этот идентификатор. Использование UPDATE TOP 1 может работать и отвечать на ваш вопрос напрямую, но не нормировка вашей базы данных является "реальной" проблемой.
http://en.wikipedia.org/wiki/Database_normalization
Ответ 4
Используйте SET ROWCOUNT;
SET ROWCOUNT 1;
ОБНОВЛЕНИЕ Production.ProductInventory
SET Количество = 400
WHERE Количество < 300;
GO
http://msdn.microsoft.com/en-us/library/ms188774.aspx
Ответ 5
-- 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