Update a single row with t-sql

前端 未结 5 2111
独厮守ぢ
独厮守ぢ 2020-12-11 00:36

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?

5条回答
  •  再見小時候
    2020-12-11 01:28

    -- 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
    

提交回复
热议问题