2010-05-25 34 views
15

Tôi muốn cập nhật một hàng trong cơ sở ngày của mình. Vấn đề là, thông qua một sai lầm về phía tôi, tôi có hai hàng dữ liệu giống hệt nhau. Làm cách nào để chạy bản cập nhật chỉ trên một hàng?Cập nhật một hàng duy nhất với t-sql

Trả lời

12

Thường bảng có một ID duy nhất. Và bạn nên lọc nó.

Ví dụ,

UPDATE YourTable 
SET YourColumnToUpdate = 'your_value' 
WHERE YourUniqueColumn = @Id 

Nếu bảng của bạn không có một ID duy nhất, hãy xem xét thêm một: một cột integer với một Primary KeyIdentity.

0

Sử dụng SET ROWCOUNT;

SET ROWCOUNT 1; Cập nhật sản xuất.ProductInventory SET Quantity = 400 WHERE Quantity < 300; GO

http://msdn.microsoft.com/en-us/library/ms188774.aspx

+0

"Sử dụng SET ROWCOUNT sẽ không ảnh hưởng DELETE, INSERT, và câu lệnh UPDATE trong phiên bản tiếp theo của SQL Server. Không sử dụng SET ROWCOUNT với DELETE INSERT, và các tuyên bố, UPDATE trong công tác phát triển mới Ngoài ra, đối với các câu lệnh DELETE, INSERT và UPDATE hiện đang sử dụng SET ROWCOUNT, chúng tôi khuyên bạn nên viết lại chúng để sử dụng cú pháp TOP.Để biết thêm thông tin, xem DELETE (Transact-SQL) , INSERT (Transact-SQL), hoặc UPDATE (Transact-SQL). " –

+0

Nice Francisco, rất quan trọng cần biết! Cảm ơn! –

21

Trong SQL Server 2005 +, bạn có thể sử dụng

UPDATE TOP (1) .... 

Ưu điểm của việc này trong SET ROWCOUNT là bất kỳ trigger sẽ không phải chịu một giới hạn ROWCOUNT, đó là gần như chắc chắn là một điều tốt.

+0

_ (ví dụ) _ 'UPDATE TOP (1) TABLE_NAME SET COLUMN_NAME = 'TOP 1'' –

3

Tôi đề nghị bạn quay lại và chuẩn hóa cơ sở dữ liệu của bạn. Ít nhất, thêm một cột tăng tự động int primary key và sử dụng id đó. Sử dụng UPDATE TOP 1 có thể làm việc và trả lời trực tiếp câu hỏi của bạn, nhưng không bình thường hóa cơ sở dữ liệu của bạn là vấn đề "thực".

http://en.wikipedia.org/wiki/Database_normalization

0
-- 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 
Các vấn đề liên quan