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システムでも
使える可能性が高い)かと思います。
No.1です。
自分への返信の後半部分はNo.2さん宛のものですかね?
DB2は触ったことがないのですが、MINUSの代わりに EXCEPT を使えばよさそうです。
SELECT
A1,A2,A4
FROM Aテーブル
EXCEPT
SELECT
B1,B2,COUNT(*)
FROM Bテーブル
GROUP BY B1,B2
考え方を整理します。
(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
記載の内容が全てで難しいこと考えなくていいなら、minusを使ってはいかがでしょうか?
SELECT
A1,A2,A4
FROM Aテーブル
MINUS
SELECT
B1,B2,COUNT(*)
FROM Bテーブル
GROUP BY B1,B2
これでBテーブルの件数とA4の値が一致しないAテーブルのレコード(全項目ではないですが)が抽出できます。
余談ですが、B1は主キーとは言わないです。主キーとはテーブル内の一意のレコードを特定できるものを言います。
あと、Oracleのバージョンも書いた方がいいと思います。バージョンによって使用できるSQLも違ってきますので。
お礼
後者のものが使うこと出来ました 大変参考になりました ありがとうございます!