• ベストアンサー

複数のテーブルから同じ条件で検索したい。

例えば、テーブルがA,B,C,Dとあって、レイアウトはそれぞれ違います。 ですが、全てのテーブルに共通の項目もあります。 共通項目名:FLG このような前提で、 A,B,C,Dのデータを同じ検索条件で全ての内容を表示させたいのですができませんか? ベタに書くと select * from A where FLG='2'; select * from B where FLG='2'; select * from C where FLG='2'; select * from D where FLG='2'; と言う感じで結果を表示させたいのです。 実際にはテーブル名がものすごい数なので、ベタに書きたくないので、この部分をtab テーブルのtnameとかを使っていっぺんに検索結果が出せればありがたいのですけが・・・ こういうのはシェルとか使わないとだめですかね?(DBはオラクルです。)

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

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.3

UNIONを使用できないのが、列数だけの問題なら SELECT [X],[Y],[Z] FROM [A] SELECT [X],[Y],NULL FROM [B] のように、列数を揃えることは可能です。 問題は、データ型だとか、結合する意味の方ですね。 例えば、上記で3番目のフィールドがNULLの場合、Bテーブルから取得したデータなので....と、プログラムの方で条件分岐させた場合、UNIONで結合した意味ないじゃん、となってしまいます。

ari_els
質問者

お礼

>列数を揃えることは可能です。 ★確かにそうですね。 因みに、データ型ですが、これもバラバラです。 なので、UNIONではちょっと駄目でしょう。 sqlだけではやっぱり、駄目っぽいですね。

その他の回答 (3)

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.4

union前提で、出力列の違いは、結果を全て文字列にして、 連結というのはダメ? select a | ',' | b | ',' | c ... from ... テーブル名がものすごい数なのは、PL-SQLが使えれば シェルより簡単かもしれません。 (DBからテーブル名を取得するのも可)

ari_els
質問者

お礼

ありがとうございます。 でも、連結はさすがにそれはきついです。 表示内容が数百項目になってしまう・・・ やっぱりシェルとかでやるしかなさそうですね。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

#1です、失礼しました。 共通項目をすべて表示ではなく、共通項目で条件検索なのですね。 UNIONは前者には使えても、後者には使えません。 忘れてください。

ari_els
質問者

お礼

いえいえ。 それと、UNIONはどの表も同じ列数じゃないといけないんですよね? 私が欲しい情報のテーブルは項目数も違うんです。 A:項目数4 B:項目数8 とか。 そうなると、前者でも駄目ってことですよね?

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.1

ORACLE御使用ということで、それなりのスキルがあるはず。 と勝手決めして、キーワードだけ。 "UNION"です。 複数のSQLで返るレコードを結合して返すSQL命令です。

関連するQ&A

  • 複数(2つ)のテーブルで検索を行いたい

    MySQL 3.23です。 select count(*) as hit from freedata where (A=10 or B=10); という構文と select count(*) as hit from sharedata where A=10; という構文を一行にしたOR検索を行いたいのですが、方法はありますか? 要は、同一のキーワードで、二つのテーブルを検索対象にしたいのです。ご教授よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 検索条件

    現在、MYSQL+PHPにて簡単な検索フォームを作っていますが、なかなか思い通りに出来ません。 例えば、フォームに4つのリストボックス項目があり、それぞれA,B,C,Dとします。 現在は SELECT * from table where A='$A' and B='$B' and C='$C' and D='$D' としていますが、フォームでAとBしか選択されなかった時などは、該当なしになってしまいます。 というのもwhere分のC=$CとD=$Dが必要ないから。 ちなみに、フォームの中のタグはそれぞれ <SELECT NAME=***> <OPTION VALUE = "">選択して下さい</OPTION> <OPTION VALUE = "***1">***1</OPTION> <OPTION VALUE = "***2"***2</OPTION> </SELECT> みたいな感じのが4つ(A~Dまで)。 (***は文字が入ってます) これを、選択されていないのはWHERE分に付け加えないようにするにはどうすれば良いでしょうか? または、私のやり方以外に何か良い方法はありますでしょうか? 説明が解りにくいかも知れませんが、お分かりの方、ヒントや方法をお教え願います。 宜しくお願いします。

  • データが存在しないか条件に一致する場合の条件文

    bテーブルにc=a.cのデータが存在しない、あるいはc=a.cに一致するフィールドdの時刻が10分経過している場合にUPDATEを実行するクエリを考案中です。ベタ書きすると以下のようになると思うのですが、同じSELECT文が2回出てきます。これらをまとめることは可能でしょうか。 UPDATE a SET foo=? WHERE id=? AND (NOT EXISTS(SELECT d FROM b WHERE c = a.c) OR TIMEDIFF((SELECT d FROM b WHERE c = a.c), NOW()) > '00:10:00');

    • ベストアンサー
    • MySQL
  • WHERE句の条件の記述の順序

    PRIMARY KEYとINDEXがテーブルに設定されている場合、 検索条件に記述する順番はどのようになるのでしょうか? 下記のテーブルがあり、SELECT文をつくろうと 考えています。 テーブル:foo 項目  PRIMARY KEY  INDEX ----------------------------------- a 1 b 2 1 c 3 d 2 (1)PRIMARY KEYを優先してWHERE句の順番を決める↓ SELECT * FROM foo WHERE a = "AAA" AND b = "BBB" AND c = "CCC" AND d = "DDD" (2) それともINDEXが設定されている項目を先に記述する↓ SELECT * FROM foo WHERE b = "BBB" AND d = "DDD"   AND a = "AAA" AND c = "CCC" (1)と(2)ではどちらの性能がよいのでしょうか?

  • テーブル参照について

    お世話になります。 AテーブルとBテーブルを比較し、Aテーブルにしかないデータ一覧を表示するSQL文を作成しました。 SELECT * FROM Aテーブル WHERE NOT EXISTS(SELECT * FROM Bテーブル WHERE CODE=Aテーブル.CODE AND NAME=Bテーブル.NAME) 下記の場合はどのように記述すればいいのでしょうか? 検索結果はAテーブルに存在しているが、BテーブルまたはCテーブルには存在していないデータ。 以上よろしくお願いいたします。

  • テーブル結合時のあいまい検索について

    はじめまして。Oracle9iでテーブル結合時のあいまい検索を行いたいのですが、エラーが起こってしまいます。 形としては、 SELECT TABLE1.A, TABLE1.B, TABLE1.C, TABLE2.D, TABLE2.E, TABLE2.F FROM TABLE1, TABLE2, WHERE TABLE1.A = TABLE2.D(+) というような形です。ここで、TABLE1のBとCに「%あ%」というあいまい検索をしたいのですが、上記の文に続いて、 AND TABLE1.B LIKE '%あ%' OR TABLE1.C LIKE '%あ%' と続けて実行すると、 ORA-01719: outer join operator (+) not allowed in operand of OR or IN というエラーになってしまいます。 こういった場合はどう対処すればよろしいのでしょうか?SQLについてほとんどわかりませんが、よろしくお願いします。

  • Nullを含む条件の検索

    Nullを含む条件の検索 Oracle10g利用して勉強中の初心者です。 Hinテーブル NO Hin Flg 1 卵 1 2 鯉 null 3 糸 0 SELECT * from Hin Where not Flg = 1 としてFlgが1以外のレコードを取得したいのですが Nullは判断しなくて困っています、 良い方法は無いでしょうか? よろしくお願いします。

  • 結合したテーブルの検索条件について。

    分からないことが出てきたので、すみませんが、教えてください。 次のような2つのテーブルを仮定します。 テーブルa  テーブルb no, title   no, aNo, delFlag  1, あえ    1, 1,  ,0 2, ああ    2, 3,  ,0 3, いう    3, 4,  ,1 4, あいあ ここで、titleに「あ」を含み、delFlagで「1」が立っていないものを検索したいのです(テーブルaのnoで、1,2を検出したい)が、 SELECT a.no AS no FROM a LEFT JOIN b ON a.no=b.aNo WHERE a.title LIKE '%あ%' and b.delFlag != 1 だと、テーブルaのno.2が検出できません。 このようなケースで、テーブルaのno1,2を選び出すことができる方法はないでしょうか? 以上、分かりにくい説明ですが、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 検索条件について

    サーバ上にある以下のようにLOAD DATAでデータベースに登録し LOAD DATA INFILE "/home/abc/test001.csv" INTO TABLE test FIELDS TERMINATED BY ','; ENCLOSED BY '"'; 登録することはできたのですが個々テーブル毎では検索できますが 複数のテーブルで検索するとうまく検索できません。 【個々のテーブルは問題なし】 select * from abc where xyz=12345; select * from 123 where xyz=12345; これですと問題なく検索がヒットします。 【複数のテーブルで検索するとうまくいかない】 select * from abc,123 where abc.xyz=123.xyz; これですと検索してもヒットしません。 ちなみにabcのxyzにある項目を「'」で括ると検索できませんでした。 データは"1","12345"でセットしています。 LOAD DATAのやり方が悪いのでしょうか? どなたか教えていただけませんでしょうか。

  • 同一テーブルの同一フィールドで複数条件指定

    例を挙げます。 テーブルA 「member」 | ID | 名前 | テーブルB 「item」 | ID | 名前 | テーブルC 「item_check」 | member.ID | item.ID | というテーブルがあります。 テーブルAはメンバーで一人一つのデータが入っています。 テーブルBはメンバーが持つであろうアイテムのマスタです。 テーブルCはメンバーがどのアイテムを持っているかを示しているテーブルです。 テーブルCに関しては同じメンバーでも複数のアイテムを持つこともあるので複数のデータが入る場合もあります。 で、やろうとしているのは、 「アイテムA と アイテムBを持っているメンバー」 という検索を行いたいのです。 同じテーブル上ならば select * from member where item1 = "A" and item2 = 'B' ... ; と、いくつでも条件が指定可能なのですが、 同じテーブルの同じフィールドを同じメンバーで複数条件指定して検索することはできるのでしょうか。 私が考えたのは一回ではできないで、 まずは一つの条件を出して while でループさせて条件を付け足してやるような効率が悪そうなものです。 (少ない件数ならばいいのですが、数千~数万件の検索になりそうなので手軽にできればと思いまして・・・) アイテムは不特定なので、1個から数十個とかの検索もありえます。 何かいい手はないでしょうか。

    • ベストアンサー
    • MySQL