- ベストアンサー
オラクルDBでの不一致の検索
ORACLE8.0.5において A-DB code char(10); updte char(14); B-DB code char(10); A-DBとB-DBにおいてcodeが不一致のデータの抽出をする場合、 select B-DB.code from A-DB,B-DB where A-DB.code <> B-DB.code and A-DB.updte >= '20020301000000' and A-DB.updte <= '20020331235959'; 上記のようなSQL文を作成し実行したが、A-DBのcodeに対してB-DBのcodeを全部検索し、B-DBの検索分がすべて不一致になってしまいました。 SQLの考え方がまちがっているのかわからないでいるので、アドバイスをお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
B-DBに存在してA-DBに存在しないcodeを検索する場合は以下のSQLです。 select code from b-db where not exists (select 'X' from a-db where code=b-db.code); 同じように、A-DBに存在してB-DBに存在しないcodeの検索は select code from a-db where not exists (select 'X' from b-db where code=a-db.code); でできます。
その他の回答 (2)
- yuji
- ベストアンサー率37% (64/169)
select code,updte from a-db where not exists (select code from b-db where b-db.code = a-db.code ) and A-DB.updte >= '20020301000000' and A-DB.updte <= '20020331235959'; ではどうでしょうか? (Oracle 8.1.6では動作しました。)
お礼
何とか実現できました。ありがとうございました。
- kots
- ベストアンサー率18% (4/22)
SQLというよりはリンクするA表とB表の作成の仕方がおかしいのでは? よく見直してみるとわかると思うのですが、A表とB表をリンク付けるものがありませんよね? 恐らくは以下の事をやりたいのでは?と思いますが。 ------------------------------------- A表 B表 1行目 aaaaa 20020301000000 bbbbb 2行目 ccccc 20020314001100 ccccc 3行目 ddddd 20020331000001 eeeee 4行目 eeeee 20020401000000 fffff で1行目と3行目のデータを抽出したい。 ------------------------------------- A表とB表をリンク(=)する情報がないと例えば、aaaaaに対して bbbbb,ccccc,eeeee,fffffをcccccに対してbbbbb,ccccc・・・・・ の様に各列に対して全てチェックしてしまうので 結果的にB表の全てのデータが当てはまってしまう結果になります。 そうしたいのであれば、 1. A表,B表に通番という列を追加 2. whereの条件に A.通番 = B.通番を追加 で、予想通りの結果が替えると思います。 一例ですが・・・。(汗;
お礼
なんとかできました。B-dbの更新のからみでselectの発行が必要だったので助かりました。