- ベストアンサー
SQLで違うテーブルの値を比較して値に差があるレコードを抽出する方法とは?
- SQLで違うテーブルの値を比較して値に差があるレコードを抽出する方法を教えてください。
- AテーブルとBテーブルの値を比較し、A4カラムの値がBテーブルのレコード数と一致しないレコードを抽出したいです。
- どのようにA4とBテーブルで数があってないものを見つけ出すことができるでしょうか。
- みんなの回答 (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システムでも 使える可能性が高い)かと思います。
その他の回答 (3)
- yamada_g
- ベストアンサー率68% (258/374)
No.1です。 自分への返信の後半部分はNo.2さん宛のものですかね? DB2は触ったことがないのですが、MINUSの代わりに EXCEPT を使えばよさそうです。 SELECT A1,A2,A4 FROM Aテーブル EXCEPT SELECT B1,B2,COUNT(*) FROM Bテーブル GROUP BY B1,B2
お礼
ありがとうございます 助かりました!
- nda23
- ベストアンサー率54% (777/1415)
考え方を整理します。 (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
お礼
回答ありがとうございます。 Oracleで上記のような結果を得たいと思っていた次第なのですが、私が間違いをしておりました。 DB2 9.5が大元になっており一部のデータをOracleへコピーしています。 Oracle側はBテーブルを持っていないためOracleではそもそも比較しようがないことがわかりました。 そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。 意味がよくわからなくて大変申し訳ないのですが、ご回答いただいたSQLの構文でJOINの後に“(”があると 無効な識別子みたいなエラーを吐き出します。 規格とかが根本から違うのでしょうか? 本当にポカミスですみません。。。
- yamada_g
- ベストアンサー率68% (258/374)
記載の内容が全てで難しいこと考えなくていいなら、minusを使ってはいかがでしょうか? SELECT A1,A2,A4 FROM Aテーブル MINUS SELECT B1,B2,COUNT(*) FROM Bテーブル GROUP BY B1,B2 これでBテーブルの件数とA4の値が一致しないAテーブルのレコード(全項目ではないですが)が抽出できます。 余談ですが、B1は主キーとは言わないです。主キーとはテーブル内の一意のレコードを特定できるものを言います。 あと、Oracleのバージョンも書いた方がいいと思います。バージョンによって使用できるSQLも違ってきますので。
お礼
回答ありがとうございます。 Oracleで上記のような結果を得たいと思っていた次第なのですが、私が間違いをしておりました。 DB2 9.5が大元になっており一部のデータをOracleへコピーしています。 Oracle側はBテーブルを持っていないためOracleではそもそも比較しようがないことがわかりました。 そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。 意味がよくわからなくて大変申し訳ないのですが、ご回答いただいたSQLの構文でJOINの後に“(”があると 無効な識別子みたいなエラーを吐き出します。 規格とかが根本から違うのでしょうか? 本当にポカミスですみません。。。
お礼
後者のものが使うこと出来ました 大変参考になりました ありがとうございます!