-1

这是我的情况。

表格1:

DOCUMENT_ID,
GUID

表 2:

DOCUMENT_ID,
FILE

这些表是由 连接的DOCUMENT_ID,这意味着TABLE2可以有一个或多个相同的行DOCUMENT_ID

我的问题是TABLE2整个一堆的值DOCUMENT_ID具有相同的FILE值。

我需要一个 SQL 查询,它可以让我全部了解并计算其中有GUID多少行具有完全相同的值(以便我可以将其复制到 Excel)。TABLE2DOCUMENT_IDFILEGUID

然后我需要为这些情况更新 UPDATETABLE2FILE列。

例如,如果DOCUMENT_ID有三行TABLE2具有相同的FILE值,我需要通过添加类似的后缀来更新其中的两行FILEVALUE-1FILEVALUE-2依此类推。

希望我说得通。

提前向所有专家致谢。

4

4 回答 4

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 作为主键的占位符。您需要一种方法来识别要更新的记录。

有现场测试@Sql Fiddle

于 2012-07-20T09:41:06.453 回答
0

这将为您提供所有超过 Document_id 的文件

Select FILE, COUNT(DOCUMENT_ID) as DOCUMENT_ID from table2
group by FILE
Having count(DOCUMENT_ID)>1
于 2012-07-20T08:51:37.870 回答
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
于 2012-07-20T09:12:24.840 回答
0

我想到了 1 种方法,但不确定它在您的最终是否可行。但让我向你保证,这是一种非常有效的方法。您可以创建一个具有标识列的表,并将整个数据插入该表中。从那里开始处理任何重复数据都是小菜一碟。有两种方法可以将标识列添加到具有现有数据的表中:

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

  2. 创建具有标识的新列并删除现有列

作为参考,我找到了 2 篇文章: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/

于 2012-07-20T09:58:09.390 回答