2012-04-24 26 views
1

私は、同じSQLテーブル内の2つのレコードを比較し、それらが異なるかどうかを知りたいと考えています。私は何が違うのかを伝える必要はなく、違いがあるだけです。同じSQLテーブル内の2つのレコードが異なるかどうかを確認する最速/最も簡単な方法は何ですか?

また、レコードの10のうち7つの列を比較するだけで済みます。つまり、各レコードには10個の列がありますが、これらの列は約7個しか気にしません。

これはSQLで行うことができますか?C#でレコードを取得し、それらをハッシュして値が異なるかどうかを確認する必要がありますか?

+2

'PRIMARY KEY'を持つテーブルでは、2つの行は同じではありません。 –

+2

@ypercubeしかし、10のフィールドのうち7つは可能です。 –

+0

@Branko:ええ、「2つのレコードが違うかどうかを教えてください」というタイトルで、私は彼が同一であるかどうかを考えさせました。まだそれは不十分wriiten質問です。 "different"の定義を変更すると、あらゆることが起こる可能性があります。 –

答えて

6

あなたは、このようなクエリでグループを書き込むことができます。

SELECT field1, field2, field3, .... field7, COUNT(*) 
FROM table 
[WHERE primary_key = key1 OR primary_key = key2] 
GROUP BY field1, field2, field3, .... field7 
HAVING COUNT(*) > 1 

あなたは出現数とともに、7にフィールド1の値が同じであるすべてのレコードを取得する方法を。

括弧で囲んだ部分をORで検索するか、IN(...)で検索するかを指定します。

+0

返事をありがとう、本当に私が探しているものではありません。私は具体的に2つのレコードを比較して、それらが異なるか等しいかどうかを調べる必要があります。私はすべての平等な記録を望んでいません。 – Mausimo

+0

@Mausimoこの2つの行にクエリを制限するには、 'WHERE'節を追加するだけです。 –

+0

あなたのテーブルに主キーがあるとします(そうでないと想像できません)、グループの直前で、primary_key = 1またはprimary_key = 2を追加します。 – verhage

1

ハッシュは必要ありません。通常の等価比較は十分です:

select isEqual = case when t1.a <> t2.a or t1.b <> t2.b bbb then 1 else 0 end 
+0

このアプローチは、NULLを含むことが許可されている列では問題になります。 –

+0

nullの明示的なテストを使用して修正できます。それは表現が非常に厄介になるので、私はそれを残しました。それでも正しいアプローチです。 – usr

2
IF EXISTS (SELECT Col1, Col2, ColEtc... 
      from MyTable 
      where condition1 
      EXCEPT SELECT Col1, Col2, ColEtc... 
      from MyTable 
      where condition2) 
BEGIN 
    -- Query returns all rows from first set that are not column for column 
    -- also in the second (EXCEPT) set. So if there are any, there will be 
    -- rows returned, which meets the EXISTS criteria. Since you're only 
    -- checking EXISTS, SQL doesn't actually need to return columns. 

END 
1
SELECT 
    CASE WHEN (a.column1, a.column2, ..., a.column7) 
      = (b.column1, b.column2, ..., b.column7) 
     THEN 'all 7 columns same' 
     ELSE 'one or more of the 7 columns differ' 
    END AS result 
FROM tableX AS a 
    JOIN tableX AS b 
    ON t1.PK = @PK_of_row_one 
    AND t2.PK = @PK_of_row_two 
0

は、あなただけのDISTINCTキーワードを使用することができませんか?すべての重複は返されないので、受け取る各行は一意です(また他とは異なります)。

SELECT DISTINCT x,y,z FROM RandomTable WHERE x = something 

のみ一意の各X、Y、Zの組み合わせごとに1行を返します。

http://www.mysqlfaqs.net/mysql-faqs/SQL-Statements/Select-Statement/How-does-DISTINCT-work-in-MySQL

だから、このクエリを作ることができます。

関連する問題