2012-02-24 3 views
7

2つの構造的に同一のテーブルがあり、table2はtable1を一括更新する際に使用される新しいデータのステージング地です。MySQLは2つのテーブルを比較し、同じプライマリキーを持ちますが他のフィールドのデータが異なる行を返します

table1でどの行が更新されるかを調べる必要があります。私は挿入される行と削除される行を無視したい。私は、更新された行に興味があります。主キーは同じままですが、行の他のフィールドの1つ以上には異なるデータが含まれています。

これまで私が一番近かったのは、次のとおりです。

SELECT table2.* FROM table2 
INNER JOIN table1 
ON table1.primarykey = table2.primarykey 
WHERE table1.field1 != table2.field1 
OR table1.field2 != table2.field2 
OR table1.field3 != table2.field3 

これは0行を返します。

EDIT:クエリが実際に動作します。データそのものに問題がありました。私はしばらくfacepalmに行くつもりです。

ありがとうございます。

+1

フィールドをNULL可能にすることはできますか? –

+0

コンラッドが取得しているので、nullはnullと等しくないので、比較の際に考慮する必要があります。書かれた方法では、データは「同じ」かもしれませんが、NULLがあれば等しくないと表示されますそこで。 – Poodlehat

+1

また、それを可能にするストレージエンジンを使用している場合は、自動コミットをオフにして、更新プログラムを実行して変更内容を確認し、ロールバックしてください。 – Poodlehat

答えて

4

あなたの説明しないことの1つはnullです。それはあなたが行がTABLE1と異なるフィールドの少なくとも一つと同じ主キーを持っているどのように多くの表2にカウントしたい言い換えれば

SELECT table2.* FROM table2 
INNER JOIN table1 
ON table1.primarykey = table2.primarykey 
WHERE table1.field1 != table2.field1 
     OR table1.field2 != table2.field2 
     OR table1.field3 != table2.field3 
     OR (table1.field1 is null and table2.field1 is not null) 
     OR (table2.field1 is null and table1.field1 is not null) 
     OR (table1.field2 is null and table2.field2 is not null) 
     OR (table2.field2 is null and table1.field2 is not null) 
     OR (table1.field3 is null and table2.field3 is not null) 
     OR (table2.field3 is null and table1.field3 is not null) 
0

データに依存し、これはしてもしなくてもよい、あなたの問題がある可能性があります、 右?しかし、データが異なるかどうかはどのように重要ですか?データが同じ場合、UPDATEは無効です。

SELECT 
    COUNT(T2.*) 
FROM 
    table2 AS T2 
JOIN table1 AS T1 ON (T1.primarykey = T2.primarykey); 
+0

これは実際に質問には答えません。質問全体を読んでいない可能性があります。銃をちょっと飛ばした – pythonian29033

関連する問題