2016-12-21 4 views
0

重複行を作成していたコードにバグがありました。ここでは、重複を削除する前に、私のテーブルの2つの列のサンプルを見ています。私は、私はこれらの行を持つテーブルが残っていますように、テーブルから重複を削除するために必要な、そしてこれを達成するために、最終的だったが、行を削除する代わりに行を挿入するクエリ

SampleID  ProjectID 
0    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
0    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
0    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
0    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
1    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
1    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
1    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
1    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
1    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
1    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
0    00e95061-96e2-4db5-999e-5ca629561c50 
0    00e95061-96e2-4db5-999e-5ca629561c50 
0    00e95061-96e2-4db5-999e-5ca629561c50 
1    00e95061-96e2-4db5-999e-5ca629561c50 
1    00e95061-96e2-4db5-999e-5ca629561c50 
1    00e95061-96e2-4db5-999e-5ca629561c50 
1    00e95061-96e2-4db5-999e-5ca629561c50 
1    00e95061-96e2-4db5-999e-5ca629561c50 

(ID列、IDと無関係である他の列があります)私の質問は、私が最初に試したクエリが期待通りに動作しなかった理由です。

SampleID  ProjectID 
0    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
1    c0f5e4cc-7664-4d70-ab3f-6ff832aa8ece 
0    00e95061-96e2-4db5-999e-5ca629561c50 
1    00e95061-96e2-4db5-999e-5ca629561c50 

私が試したクエリが

DELETE FROM INS_Sample WHERE ID NOT IN 
(SELECT MIN(ID) FROM INS_Sample GROUP BY SampleID, ProjectID); 

であり、私はthis質問への答えでそれを見つけました。私はこのクエリを実行したとき、それは無期限に実行されていたので、私はそれを停止し、クエリは実際にテーブルに重複行を挿入していた。私が最初にSELECT MIN(ID) FROM INS_Sample GROUP BY SampleID, ProjectIDを実行し、私は私が望む結果を得ることができる前に、それはこの

DELETE FROM INS_Sample WHERE ID NOT IN 
(1234, 5678, /*a lot more IDs*/); 

ように見えたように、私の元のクエリに貼り付ける結果ID秒のカンマ区切りリストを作成しなければなりませんでした。なぜ私の最初のクエリは正常に動作しないのですか?また、テーブル内に行がどのように挿入されたのでしょうか?私のクエリエディタには、テーブルにあるものを見るためのselect以外のものはありません。

答えて

0

あなたはDELETE文を実行しているし、それがINSERTないことをいくつかのレコードが1つだけの方法が存在することができるので、このようにそれはあなたのテーブルにDELETEを行うが、それでもあなたが言うならば、それはTRIGGERです。 INS_Sampleテーブルにトリガー(具体的にはAFTER DELETEトリガー)を定義しているかどうかを確認してください。

+0

のようなクエリを試すことができます現時点ではAzure DBだから、削除された行を復元するために何かがあるのか​​もしれないのだろうか?私はこの時点でわらでつかんでいます。 – Sam07

+0

@Samの場合、フル/差分バックアップのいずれかのテーブルのバックアップがあります。うまくいけばそこから復元することができます。 – Rahul

+0

私は実際に重複行を復元したくありません。私はそれらを削除する必要がありました。私は元のクエリを実行した理由が、それらを削除する代わりに再度行を挿入していた理由を理解できません。私はバグの多いソフトウェアでより多くのデータを実行してテーブルに重複した行を作成し、それを再現しようとします。 – Sam07

0

deleteクエリはテーブルに行を挿入できません。 。 。このような動作を実装しているテーブルにトリガーがない場合は、

idsが一致しないと、クエリがハングしてテーブルに何もしないことがあります。 idはIDですが、主キーかどうかは指定しません。サブクエリのidの場合、NULLの場合、NOT INはtrueに評価されません。

私の代わりにこのようなものを使用することをお勧め:

DELETE 
    FROM INS_Sample s 
WHERE s.id > (SELECT MIN(ID) 
       FROM INS_Sample s2 
       WHERE s2.SampleId = s.SampleID AND s2.ProjectID = s.ProjectID 
      ); 
+0

IDは主キーで、nullになることはできません。 – Sam07

0

あなたは「`TRIGGER`があれば、私はにISN別のエンジニアに依頼する必要があります。この

;with cte as (
select RowN = row_number() over (partition by sampleid, projectid order by sampleid, projectid) from yourproject 
) delete from cte where RowN > 1 
+0

私は既に行を削除することができました。それは私の質問ではありませんでした。私は最初に試したクエリが期待どおりに動作しなかった理由について質問していました。 – Sam07

+0

ここには何がありますか? –

関連する問題