如何在相关表中找到重复值并更新它们

时间:2012-07-20 08:47:54

标签: sql sql-server

这是我的情况。

TABLE1:

DOCUMENT_ID,
GUID

TABLE2:

DOCUMENT_ID,
FILE

表格由DOCUMENT_ID加入,这意味着TABLE2可以有一行或多行具有相同的DOCUMENT_ID

我的问题是,TABLE2的整群DOCUMENT_ID值具有相同的FILE值。

我需要一个SQL查询,它会让我全部GUID,并计算TABLE2DOCUMENT_ID的{​​{1}}行中有多少行具有相同的FILE值(以便我可以将GUID复制到Excel。

然后我需要为这些案例更新TABLE2的{​​{1}}列。

例如,如果FILEDOCUMENT_ID中有三行且TABLE2值相同,我需要通过添加FILE等{{1}后缀来更新其中两行等等。

希望我有意义。

所有专家都提前感谢你。

4 个答案:

答案 0 :(得分:1)

要获得重复项,您可以使用旧式组:

select table1.guid, table1.document_id, table2.[file], count(*) cnt
  from table1
 inner join table2
    on table1.document_id = table2.document_id
 group by table1.guid, table1.document_id, table2.[file]
having count (*) > 1

要直接更新重复项,您可以使用CTE:

; with t2 as (
    select id, 
           [file],
           row_number() over (partition by document_id, [file]
                              order by id) rn
      from table2
)
update t2
   set [file] = [file] + '-' + convert(varchar(10), rn - 1)
 where t2.rn > 1

请注意,我已将ID添加为主键的占位符。您需要一种方法来识别要更新的记录。

There is live test @ Sql Fiddle

答案 1 :(得分:0)

这将为您提供所有具有多个Document_id

的文件
Select FILE, COUNT(DOCUMENT_ID) as DOCUMENT_ID from table2
group by FILE
Having count(DOCUMENT_ID)>1

答案 2 :(得分:0)

您可以使用CTE从TABLE2中找出重复值:

WITH CTE_1 (DOCUMENT_ID,FILE, DuplicateCount)
AS
(
SELECT DOCUMENT_ID,FILE,
ROW_NUMBER() OVER(PARTITION BY DOCUMENT_ID,FILE ORDER BY DOCUMENT_ID) AS DuplicateCount
FROM table2
)
select *
FROM CTE_1 
WHERE DuplicateCount >1

答案 3 :(得分:0)

我有一种方法,但不确定它是否可行。但请允许我向您保证,这是一种非常有效的方法。您可以创建具有标识列的表,并将整个数据插入该表中。从那里开始处理任何重复数据都是孩子的游戏。 有两种方法可以将标识列添加到具有现有数据的表中:

  1. 使用标识创建一个新表,将数据复制到此新表,然后删除现有表,然后重命名临时表。

  2. 使用identity&创建一个新列删除现有列

  3. 作为参考,我找到了两篇文章: http://blog.sqlauthority.com/2009/05/03/sql-server-add-or-remove-identity-property-on-column/
    http://cavemansblog.wordpress.com/2009/04/02/sql-how-to-add-an-identity-column-to-a-table-with-data/