Sql server 在SQL Server 2008 R3中使用单个存储过程更新唯一/重复的数据记录

Sql server 在SQL Server 2008 R3中使用单个存储过程更新唯一/重复的数据记录,sql-server,stored-procedures,sql-server-2008-r2,duplicates,Sql Server,Stored Procedures,Sql Server 2008 R2,Duplicates,我有一个带有以下列的表FileInfo **(SID int) Primary Key & AutoIncrement, FileName varchar, FilePath varchar, fileExtn varchar, CreatedDate smalldatetime, Duplicate varchar, LatestCopy varchar.** 本文件中的记录如下所示 1, 02-2511-510.pdf, C:\Desktop\02-2511-510.pdf, .p

我有一个带有以下列的表FileInfo

**(SID int) Primary Key & AutoIncrement,
FileName varchar,
FilePath varchar,
fileExtn varchar,
CreatedDate smalldatetime,
Duplicate varchar,
LatestCopy varchar.**
本文件中的记录如下所示

1, 02-2511-510.pdf, C:\Desktop\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, NULL, NULL
2, 04-4648-500.doc, C:\Desktop\04-4648-500.doc, .doc, 2010-10-01 00:00:00, NULL, NULL
3, 02-2511-510.pdf, D:\Users\ers\02-2511-510.pdf, .pdf, 2000-11-13 00:00:00, NULL, NULL
4, 02-2511-510.pdf, E:\AGES\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, NULL, NULL
1, 02-2511-510.pdf, C:\Desktop\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, Y, N
2, 04-4648-500.doc, C:\Desktop\04-4648-500.doc, .doc, 2010-10-01 00:00:00, N, Y
3, 02-2511-510.pdf, D:\Users\ers\02-2511-510.pdf, .pdf, 2013-11-13 00:00:00, Y, Y
4, 02-2511-510.pdf, E:\AGES\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, Y, N
运行存储过程后,表数据应如下所示

1, 02-2511-510.pdf, C:\Desktop\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, NULL, NULL
2, 04-4648-500.doc, C:\Desktop\04-4648-500.doc, .doc, 2010-10-01 00:00:00, NULL, NULL
3, 02-2511-510.pdf, D:\Users\ers\02-2511-510.pdf, .pdf, 2000-11-13 00:00:00, NULL, NULL
4, 02-2511-510.pdf, E:\AGES\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, NULL, NULL
1, 02-2511-510.pdf, C:\Desktop\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, Y, N
2, 04-4648-500.doc, C:\Desktop\04-4648-500.doc, .doc, 2010-10-01 00:00:00, N, Y
3, 02-2511-510.pdf, D:\Users\ers\02-2511-510.pdf, .pdf, 2013-11-13 00:00:00, Y, Y
4, 02-2511-510.pdf, E:\AGES\02-2511-510.pdf, .pdf, 2000-10-12 00:00:00, Y, N
  • 基本上,我需要根据FileName列查找重复项
  • 如果文件多次出现,请将重复列设置为“Y”
  • 然后根据CreatedDate查找文件的最新副本,并将最新副本值设置为Y
  • 我能够编写一个存储过程来查找重复项并将列重复项更新为Y/N。我还希望在同一存储过程中包含最新副本的标记。我该怎么做呢

    如果我犯了任何错误,我深表歉意,因为我正在学习SQL


    向您当前的数据致意

    ╔═════╦═════════════════╦══════════════════════════════╦══════════╦═════════════════════╦═══════════╦════════════╗
    ║ SID ║    FileName     ║           FilePath           ║ fileExtn ║     CreatedDate     ║ Duplicate ║ LatestCopy ║
    ╠═════╬═════════════════╬══════════════════════════════╬══════════╬═════════════════════╬═══════════╬════════════╣
    ║   1 ║ 02-2511-510.pdf ║ C:\Desktop\02-2511-510.pdf   ║ .pdf     ║ 2000-10-12 00:00:00 ║ NULL      ║ NULL       ║
    ║   2 ║ 04-4648-500.doc ║ C:\Desktop\04-4648-500.doc   ║ .doc     ║ 2010-10-01 00:00:00 ║ NULL      ║ NULL       ║
    ║   3 ║ 02-2511-510.pdf ║ D:\Users\ers\02-2511-510.pdf ║ .pdf     ║ 2000-11-13 00:00:00 ║ NULL      ║ NULL       ║
    ║   4 ║ 02-2511-510.pdf ║ E:\AGES\02-2511-510.pdf      ║ .pdf     ║ 2000-10-12 00:00:00 ║ NULL      ║ NULL       ║
    ╚═════╩═════════════════╩══════════════════════════════╩══════════╩═════════════════════╩═══════════╩════════════╝
    
    更新查询

    1) 更新重复数据的位置

        ;WITH Updateables
        AS
        (
          SELECT * , rn = ROW_NUMBER() OVER (PARTITION BY [FileName] ORDER BY [FileName])
    DESC)
          FROM Table_Name
        )
        UPDATE Updateables 
        SET Duplicate = 'Y'
        WHERE [FileName] IN (SELECT [FileName] 
                        FROM Updateables WHERE rn > 1 )
    
    2) 更新至
    Y
    最新版本

    ;WITH Updateables
    AS
    (
      SELECT * , rn2 = ROW_NUMBER() OVER (PARTITION BY [FileName] ORDER BY CreatedDate DESC)
      FROM Table_Name
    )
    UPDATE Updateables 
    SET LatestCopy = 'Y'
    WHERE [SID] IN (SELECT [SID]
                    FROM Updateables WHERE rn2 = 1)
    
    结果集

    ╔═════╦═════════════════╦══════════════════════════════╦══════════╦═════════════════════╦═══════════╦════════════╗
    ║ SID ║    FileName     ║           FilePath           ║ fileExtn ║     CreatedDate     ║ Duplicate ║ LatestCopy ║
    ╠═════╬═════════════════╬══════════════════════════════╬══════════╬═════════════════════╬═══════════╬════════════╣
    ║   1 ║ 02-2511-510.pdf ║ C:\Desktop\02-2511-510.pdf   ║ .pdf     ║ 2000-10-12 00:00:00 ║ Y         ║ NULL       ║
    ║   2 ║ 04-4648-500.doc ║ C:\Desktop\04-4648-500.doc   ║ .doc     ║ 2010-10-01 00:00:00 ║ NULL      ║ Y          ║
    ║   3 ║ 02-2511-510.pdf ║ D:\Users\ers\02-2511-510.pdf ║ .pdf     ║ 2000-11-13 00:00:00 ║ Y         ║ Y          ║
    ║   4 ║ 02-2511-510.pdf ║ E:\AGES\02-2511-510.pdf      ║ .pdf     ║ 2000-10-12 00:00:00 ║ Y         ║ NULL       ║
    ╚═════╩═════════════════╩══════════════════════════════╩══════════╩═════════════════════╩═══════════╩════════════╝