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
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 Key
và Identity
.
Sử dụng SET ROWCOUNT;
SET ROWCOUNT 1; Cập nhật sản xuất.ProductInventory SET Quantity = 400 WHERE Quantity < 300; GO
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.
_ (ví dụ) _ 'UPDATE TOP (1) TABLE_NAME SET COLUMN_NAME = 'TOP 1'' –
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".
-- 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
- 1. Cập nhật bằng CTE và số hàng làm truy vấn cập nhật TSQL hoặc hàng loạt với ROW_NUMBER()
- 2. TSQL: cập nhật một cột thành null
- 3. Erlang: Mnesia: Cập nhật một giá trị trường duy nhất trong một hàng
- 4. Postgresql, cập nhật nếu hàng có một số giá trị duy nhất tồn tại, hãy chèn
- 5. Cập nhật TSQL phút và giây DATETIME
- 6. SQLAlchemy cập nhật nếu khóa duy nhất tồn tại
- 7. Nhiều hàng với một INSERT duy nhất trong SQLServer 2008
- 8. ListView Đang cập nhật một hàng
- 9. MySQL ON CẬP NHẬT KEY TUYÊN BỐ với cột nullable trong khóa duy nhất
- 10. Cách nhanh nhất để cập nhật bảng MySQL nếu hàng tồn tại khác chèn. Hơn 2 phím không duy nhất
- 11. Thông báo cập nhật để cập nhật nhiều hàng
- 12. Cập nhật hàng loạt với Mongoose
- 13. MySQL 'CẬP NHẬT TRÊN KHÓA KHẨU' mà không có một cột duy nhất?
- 14. Perl: Cập nhật nhiều hàng với một cuộc gọi MySQL
- 15. cập nhật SQL nhiều hàng với cùng một giá trị
- 16. tsql: cách tốt nhất để cập nhật bảng db bằng tệp csv
- 17. Tìm nạp các hàng duy nhất, cột duy nhất với PDO
- 18. MySQL: trở về cập nhật hàng
- 19. Cập nhật hàng loạt/cập nhật hàng loạt JPA Hibernate trong Spring MVC
- 20. Cập nhật timestamp khi hàng được cập nhật trong PostgreSQL
- 21. có được một hàng duy nhất từ bảng
- 22. hàng loạt bản sao duy nhất sửa đổi file
- 23. Chèn hoặc cập nhật hàng loạt NHibernate
- 24. TSQL 2005, XML DML - Cập nhật hai giá trị cùng một lúc?
- 25. Cập nhật dữ liệu hàng với một giá trị mới trên mỗi hàng bằng cách sử dụng trình thông thạo
- 26. xuất nhiều bảng truy cập vào một XML duy nhất
- 27. Cập nhật các hàng trong Liquibase với câu lệnh WHERE
- 28. Cập nhật hàng loạt với LINQ to SQL
- 29. Cập nhật nhiều hàng LINQ vs SQL
- 30. Cập nhật hàng loạt/xóa EF5
"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). " –
Nice Francisco, rất quan trọng cần biết! Cảm ơn! –