-1

これが私の状況です。

表1:

DOCUMENT_ID,
GUID

表 2:

DOCUMENT_ID,
FILE

テーブルは によって結合されます。DOCUMENT_IDつまりTABLE2、同じ を持つ 1 つまたは複数の行を持つことができますDOCUMENT_ID

私の問題は、TABLE2たくさんの値DOCUMENT_IDが同じFILE値を持つことです。

私はすべてを取得し、これGUIDの何行がまったく同じ値を持つかをカウントするSQLクエリが必要です(Excelにコピーできるように)。TABLE2DOCUMENT_IDFILEGUID

次に、これらのケースの UPDATETABLE2FILE列が必要です。

たとえば、同じ値のDOCUMENT_ID行が 3 つある場合、などの接尾辞を追加して、そのうちの 2 つを更新する必要があります。TABLE2FILEFILEVALUE-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

私は1つのアプローチを念頭に置いていますが、それがあなたの側で実行可能かどうかはわかりません。しかし、これは非常に効果的なアプローチです。ID列を持つテーブルを作成し、そのテーブルにデータ全体を挿入できます。そして、そこから重複データを処理するのは子供の遊びです。既存のデータを含むテーブルにID列を追加する方法は2つあります。

  1. IDを使用して新しいテーブルを作成し、この新しいテーブルにデータをコピーしてから、既存のテーブルを削除してから、一時テーブルの名前を変更します。

  2. IDを使用して新しい列を作成し、既存の列を削除します

参考までに、私は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 に答える
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 に答える