- 締切済み
SQL初心者です。ご教授願います。
SQL初心者です。ご教授願います。 テーブルAとテーブルBの比較をしたいと思っています。 比較するのは、全項目(もしくは、特定の項目でもかまいません)です。 どなたか、SQLのアドバイスをお願いします。 条件 ・DB: Microsoft SQLserver2000 ・テーブルAとテーブルBの項目は同じ(コピーして作られたもの)です。 ・比較は全項目です(キー項目の有無も含まれます)。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jamshid6
- ベストアンサー率88% (591/669)
#1です。 >キーワード 'EXCEPT' 付近に正しくない構文があります。 アイタタ。。そうでした。SQL Server 2000はEXCEPTできないんでした。 失礼しました。 そうすると、以下のようにやって頂くしかないですかね。 (EXCEPTの代わりにグルーピングを使って、差分をはじきます) GROUPのために、項目を全部切らないといけないのが悩ましいですが。。 SELECT a.*, b.* FROM (SELECT キー項目,項目1,項目2,.....項目n FROM (SELECT *,'A' TBL FROM テーブルA UNION ALL SELECT *,'B' TBL FROM テーブルB) a1 GROUP BY キー項目,項目1,項目2,.....項目n HAVING MIN(TBL)='A' AND MAX(TBL)='A') a FULL OUTER JOIN (SELECT キー項目,項目1,項目2,.....項目n FROM (SELECT *,'A' TBL FROM テーブルB UNION ALL SELECT *,'B' TBL FROM テーブルA) b1 GROUP BY キー項目,項目1,項目2,.....項目n HAVING MIN(TBL)='B' AND MAX(TBL)='B') b ON b.キー項目=a.キー項目
- jamshid6
- ベストアンサー率88% (591/669)
テーブルのレイアウトが同じならば、以下の方法が簡単でしょう。 SELECT * FROM テーブルA EXCEPT SELECT * FROM テーブルB SELECT * FROM テーブルB EXCEPT SELECT * FROM テーブルA 前者は「テーブルAにあって、テーブルBにないもの」、 後者は「テーブルBにあって、テーブルAにないもの」を返します。 便宜上テーブルBは、テーブルAの少し古いのコピーだとすると、 ・テーブルAに追加された・・1つ目のクエリの結果に含まれる ・テーブルAから削除された・・2つ目のクエリの結果に含まれる ・テーブルAの内容が変更された・・両方のクエリの結果に含まれる 上記を踏まえて、上記の2つのクエリを完全外部結合すれば、 テーブルAとテーブルBの相違内容がキー別に横並びで表示されます。 SELECT a.*, b.* FROM (SELECT * FROM テーブルA EXCEPT SELECT * FROM テーブルB) a FULL OUTER JOIN (SELECT * FROM テーブルB EXCEPT SELECT * FROM テーブルA) b ON b.キー項目=a.キー項目 なお、変更された項目がどの項目かは、CASE式などを使って個別に条件を切るしかないと思います。
お礼
早速のご回答、ありがとうございました。 いろいろと勉強させていただきました。 現状、頂きましたSQLを実行してみたのですが " キーワード 'EXCEPT' 付近に正しくない構文があります。" のエラーが表示されてしまいました。 SQLserver2000 では、'EXCEPT' は使えると思うのですが なぜかエラーが。。。 指定ミスかもしれませんので、ちょっと確認してみます。 奔走に、ありがとうございました。
お礼
ありがとうございました。 勉強になりました。