• ベストアンサー

オラクル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の考え方がまちがっているのかわからないでいるので、アドバイスをお願いいたします。

  • patak
  • お礼率20% (24/115)

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

  • ベストアンサー
  • PBG3
  • ベストアンサー率77% (7/9)
回答No.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); でできます。

patak
質問者

お礼

なんとかできました。B-dbの更新のからみでselectの発行が必要だったので助かりました。

その他の回答 (2)

  • yuji
  • ベストアンサー率37% (64/169)
回答No.2

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では動作しました。)

patak
質問者

お礼

何とか実現できました。ありがとうございました。

  • kots
  • ベストアンサー率18% (4/22)
回答No.1

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.通番を追加 で、予想通りの結果が替えると思います。 一例ですが・・・。(汗;

関連するQ&A

  • DB検索について

    (1)PHPにてSQLをコールしてテーブルから情報の取得を行いたいのです。  $cmnd = "select * from table_a where id=01";を実行し(fetch使用)  仮に15件セレクトされたとすると、抽出された15件は  プログラム内のどこに格納されるのですか? (2)また、そのレコードを順じ処理する場合において、終了条件はどの様に  判定したら良いでしょうか?  DB:oracle

    • 締切済み
    • PHP
  • PCC-S-02201エラー

    こんにちは。 現在Oracle9 Pro*Cで開発をしているのですが、下記のSQLでコンパイルエラーが出てしまいます。エラー内容は 「PCC-S-02201, 記号"+"が見つかりました。」 SQLPlus上では問題なく検索されるのですが、うまくいきません。 何が問題なのでしょうか? EXEC SQL SELECT A_DAY FROM DB1 WHERE B_NUM = ((SELECT B_NUM FROM DB1 WHERE A_DAY = '20040722') + 1); B_NUMはNUMBER型です。

  • Oracle 10.2.0 でMAX集計がおかしい!?

    VB6 で oo4o を使って Oracle DB開発をしています。 Oralce 8.1.6 から Oracle10.2.0 にサーバを切り替えました。 bというテーブルがあって、 a c d ---- ------ ----- 10 2 1 20 3 1 30 4 1 40 5 1 50 6 2 というデータがあったとします。 Select MAX(a) as a from b WHERE d=1 のようなSQLをVBから発行したときに SQL*PLUSでは、 a ---- 40 という結果が返ってくるのですが、VBでは、 a --- 10 20 30 40 のように複数行のレコードセットが帰ってきます。そのため、最大行を取得できません。Oracle8 のときは、SQL*PLUSと同じ結果が返ってきていました。ちなみに Select MAX(a) as a from b WHERE d=1 GROUP BY d ~~~~~~~~~~ と、GROUP BYを付けると、ただしい(SQL_PLUSと同じ値)値が取得できます。 Oracle10.2.0の問題か、oo4oの問題かと考えています。 ちなみにoo4oのオブジェクトは、 CreateObject("OracleInProcServer.XOraSession") で作成していて、クライアントのバージョンは 9.2.0.4.4です。 長文で失礼しますが、どなたかSQLを変更せずに解決する方法をご存じないでしょうか?

  • DBを問わないSQLのチューニングが学べる本はありますか?

    以下のSQLはほぼ全てのDBで使用できると思いますが どちらが高速なのでしょうか?このような、 DBを問わずにSQL文に関する基礎的なチューニングが学べる本はありますでしょうか? (1)JOINを使わずに結合 select * from A,B,C WHERE A.a=B.a AND A.b =C.b (2)JOINを使用して結合 select * from A left join B on A.a=B.a left join C on A.b=C.b

  • Oracle SQL DELETE文のレスポンス

    いつもお世話になっております。 この度は、手前のSQL文において DELETE文のレスポンスが上がらずに難儀しています。 現在DELETE処理はバッチにて行っています。 最初にSELECTにて抽出を行ったものをバックアップにとり、 次は同様の条件でDELETE文で処理しています。 この際に、SELECTでは1秒程度で済んだ処理が、 DELETE文ではレスポンスが返ってこないという状況です。 何がまずいのか、どう工夫すればいいのか 色々変えてみましたがレスポンスは改善されません。 SQLと条件は以下です。 【SQL文】 SELECT 複数の項目 FROM TABLEA A WHERE NOT Exists(SELECT 'X' FROM TABLEB B WHERE A.ITEMNO = B.ITEMNO) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO = C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < C.REPYMD) AND NOT Exists (SELECT 'X' FROM TABLEA2 A2 WHERE A.ITEMNO = A2.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A2.CREATEDATE,'YYYYMMDD')) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO != C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A.CREATEDATE,'YYYYMMDD')) 上記のSELECT文の後に処理されるDELETE文は 「SELECT 複数の項目 FROM TABLEA A」 ⇒ DELETE FROM TABLEA A としたもので、 条件は全てSELECT文と同様のものを使用しています。 ◆条件を言葉で明記すると以下のようになります。 1.Bテーブルに存在するものは削除対象外とする 2.AテーブルのアイテムIDとCテーブルのアイテムIDは一致する。   AテーブルのCREATEDATEとCテーブルのREPYMDのいずれかが3ヶ月以内のアイテムは   削除対象外とする 3.AテーブルもしくはCテーブルにしか存在しない場合は、各日付が3ヶ月以内のアイテムは   削除対象外とする 以上のようになっています。 どなたかアドバイスをいただければ幸いです。 宜しくお願い致します。

  • 抽出した行数を変数に入れたい(オラクルSQL)

    SELECTで抽出した行数を変数に格納したいのですが、上手くいきません。 SQLにあまり経験がなく、ネットで調べながら実践しております。 例えば以下の簡単なSQLを作ったとして、 ---------------------------------------------------- SELECT a,b,c,d,e,f FROM table WHERE c=10 AND e=20; ---------------------------------------------------- ここで抽出した行数を取得し、それを変数に入れたいと思っております。 というのも、後々、抽出したデータの行数を表示したい場合に SELECT COUNT(*) FROM table WHERE c=10 AND e=20; というSQLをその都度入力していては非効率だと思ったからです。 そこで抽出する際に行数を取得し、それを変数に格納して、 行数を表示する処理が今後必要になった際に、その変数を表示すれば良いと考えました。 ですがネットで変数のことを調べた際に VARやDEFINE等のコマンドを見つけましたが、SQLを実行しても上手くいきません。 最初に記載したSQLに、どのような構文を入れたら良いのでしょうか。

  • LIKE検索の場合うまくいきません

    WEBアプリとSQLServerでSELECTをするときに不正をされないように SELECT * FROM DB WHERE DB.A = 検索文字 を SELECT * FROM DB WHERE DB.A= @A のようにして、@Aを後で指定しますが、 SELECT * FROM DB WHERE LIKE '%検索文字' のようにLIKE検索の場合うまくいきません。 どのように記述したらいいのでしょうか? SELECT * FROM DB WHERE DB.A LIKE @A --> 駄目 SELECT * FROM DB WHERE DB.A LIKE '%@A' --> 駄目

  • sjisでのあいまい検索を教えてください

    Postgres8です。 データベースのエンコーディングは【SQL_ASCII】です。 LIKE検索をした場合のSJISの文字化けに対する対処方法を教えてください あいまい検索をしたいのですが、 文字化け対象文字を含む場合、 どのように記述すればいいのですか? select * from aaa where name = 'パソ\コン'; 上記のように完全一致で検索をすると抽出できます。 select * from aaa where name like '%パソ%' 上記のよう指定してlike検索をしても抽出できます。 しかし以下の場合どちらでも抽出できません。 select * from aaa where name like '%パソコ%' select * from aaa where name like '%パソ\コ%' よろしくお願い致します。

  • ACCESSパススルークエリでオラクルDB接続

    パススルークエリを用いてオラクルDBの「売上明細」テーブルのデータを抽出する。 抽出の対象はLOCALのテーブル「対象年月」で指定した月のデータに絞る。 上記の抽出をする場合、選択クエリのSQLでは Select * From 売上明細 Where Exists (Select * From 対象年月 Where 売上明細.YM=対象年月.YM); で抽出出来るのですが、パススルーだと#942「表またはビューが存在しません。」 のエラーが出ます。  年月の条件を付けずにすべてのデータを抽出することは出来るのですが 構文教えていただけるとありがたいのですが

  • VB.NETでDataTableにデータ追加したい

    VisualStugio.Net2003でソースコードを記述しており、コード内でSQLのSELECT文を実行して、実行結果をDataTableに格納する処理をしています。 今回、とあるテーブルに対し2パターンのSQLを実行し、それぞれの実行結果を1つのDataTableに格納したいのですが、どのようにすれば良いでしょうか? 自分で調べたところ、先に実行したSQL結果に、後から実行したSQL結果を1行ずつ追加するといった方法は見つかりましたが、1行ずつではなく、一括で追加する方法が知りたいです。 前提として、2回のSQL実行では、同じテーブルの同じ項目をSELECTしております。 下記に簡単ですがコード記述の概要を補足しておきます。 ・コード記述概要 【変数宣言】 Dim DB1 As DataTable Dim DB2 As DataTable 【SQL文1】 SELECT A,B,C FROM テーブル1 WHERE 条件文1 DB1 = SQL文1の実行結果 【SQL文2】 SELECT A,B,C FROM テーブル1 WHERE 条件文2 DB2 = SQL文2の実行結果 【DB1にDB2のデータを追加】←ここのやり方を知りたいです DB1 = DB1 + DB2 よろしくお願いいたします。