- ベストアンサー
クエリの書き方 除外
SQLで Aテーブル、Bテーブルで構造自体まったく同じものですが データが一部違うものがあったとします。 select count(*) as cnt from A, B where A.fld <> B.fld とすると、A,Bテーブル共に異なるフィールドの個数を取得できますが Aテーブルにはあって、Bテーブルにないものは除外して上の条件を満たすクエリはどのように書くのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
LEFT JOINしてNULLをカウントするだけでよいのでは?
その他の回答 (1)
- root139
- ベストアンサー率60% (488/809)
> select count(*) as cnt from A, B where A.fld <> B.fld > とすると、A,Bテーブル共に異なるフィールドの個数を取得できますが 「count(*) as cnt」の部分を「*」に変えて下記の様にして実行してみると分かりますが、A.fld と B.fld が異なるもの組合せが取得されます。 select * from A, B where A.fld <> B.fld 例えば、下記の様なテーブルが合った場合は、{1,2,3}と{3,4,5}の組合せ9つのうちから3-3を除いた8つの組合せが取得されます。 --------------------------------------------- ■ Aテーブル fld ---- 1 2 3 ■ Bテーブル fld ---- 3 4 5 ■ 取得結果 A.fld | B.fld 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 --------------------------------------------- おそらく、取得されたいのは別のものになると思いますが、テーブルには結合条件となりうる他のカラムは有りますでしょうか? もし無いとしたら、単純に「Aにfldに有って、Bにfldに無い値の数」という条件で良いと思います。 そう仮定した上だと下記の様になるかと。 --------------------------------------------- SELECT COUNT(*) as cnt FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE A.fld = B.fld) --------------------------------------------- 先のAテーブルが{1,2,3}、Bテーブルが{3,4,5}の例だと、2が取得されます。これも「COUNT(*)」の部分を「*」に置き換えればどのレコードがカウントされているのか分かります。