• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいので)

SQLで違うテーブルの値を比較して値に差があるレコードを抽出する方法とは?

このQ&Aのポイント
  • SQLで違うテーブルの値を比較して値に差があるレコードを抽出する方法を教えてください。
  • AテーブルとBテーブルの値を比較し、A4カラムの値がBテーブルのレコード数と一致しないレコードを抽出したいです。
  • どのようにA4とBテーブルで数があってないものを見つけ出すことができるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

SELECT A.* FROM Aテーブル A INNER JOIN TABLE(SELECT B1,B2,COUNT(*) SU FROM Bテーブル GROUP BY B1,B2) B ON A.A1=B.B1 AND A.A2=B.B2 AND A.A4<>B.SU または WITH B(B1,B2,SU) AS (SELECT B1,B2,COUNT(*) SU FROM Bテーブル GROUP BY B1,B2) SELECT A.* FROM Aテーブル A INNER JOIN B ON A.A1=B.B1 AND A.A2=B.B2 AND A.A4<>B.SU こんなのでどうでしょうか? 後者の方が標準的(他のDBシステムでも 使える可能性が高い)かと思います。

mr-r00
質問者

お礼

後者のものが使うこと出来ました 大変参考になりました ありがとうございます!

その他の回答 (3)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

No.1です。 自分への返信の後半部分はNo.2さん宛のものですかね? DB2は触ったことがないのですが、MINUSの代わりに EXCEPT を使えばよさそうです。 SELECT A1,A2,A4 FROM Aテーブル EXCEPT SELECT B1,B2,COUNT(*) FROM Bテーブル GROUP BY B1,B2

mr-r00
質問者

お礼

ありがとうございます 助かりました!

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

考え方を整理します。 (1)BテーブルのB1、B2をキーとして件数を取得 (2)Aテーブル上で同じキーを持ち、かつ(1)の数と   A4の値が異なるものを抽出 SELECT A.* FROM Aテーブル A INNER JOIN (SELECT B1,B2,COUNT(*) SU FROM Bテーブル GROUP BY B1,B2) B ON A.A1=B.B1 AND A.A2=B.B2 AND A.A4<>B.SU

mr-r00
質問者

お礼

回答ありがとうございます。 Oracleで上記のような結果を得たいと思っていた次第なのですが、私が間違いをしておりました。 DB2 9.5が大元になっており一部のデータをOracleへコピーしています。 Oracle側はBテーブルを持っていないためOracleではそもそも比較しようがないことがわかりました。 そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。 意味がよくわからなくて大変申し訳ないのですが、ご回答いただいたSQLの構文でJOINの後に“(”があると 無効な識別子みたいなエラーを吐き出します。 規格とかが根本から違うのでしょうか? 本当にポカミスですみません。。。

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

記載の内容が全てで難しいこと考えなくていいなら、minusを使ってはいかがでしょうか? SELECT A1,A2,A4 FROM Aテーブル MINUS SELECT B1,B2,COUNT(*) FROM Bテーブル GROUP BY B1,B2 これでBテーブルの件数とA4の値が一致しないAテーブルのレコード(全項目ではないですが)が抽出できます。 余談ですが、B1は主キーとは言わないです。主キーとはテーブル内の一意のレコードを特定できるものを言います。 あと、Oracleのバージョンも書いた方がいいと思います。バージョンによって使用できるSQLも違ってきますので。

mr-r00
質問者

お礼

回答ありがとうございます。 Oracleで上記のような結果を得たいと思っていた次第なのですが、私が間違いをしておりました。 DB2 9.5が大元になっており一部のデータをOracleへコピーしています。 Oracle側はBテーブルを持っていないためOracleではそもそも比較しようがないことがわかりました。 そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。 意味がよくわからなくて大変申し訳ないのですが、ご回答いただいたSQLの構文でJOINの後に“(”があると 無効な識別子みたいなエラーを吐き出します。 規格とかが根本から違うのでしょうか? 本当にポカミスですみません。。。

関連するQ&A