• ベストアンサー

複数検索について

urizakaです。 現在、SQL-ServerとJBUilderでJSPの開発を行っているのですが、そのときに 一覧表を表示させるために、次のようなテーブルを作りました テーブル名:m_project code_proj projname makestaff  repstaff workstaff approvestaff 1      開発    1       2      1      2 2      購買    3       1      2      3 3      支援    2       3      1      2 テーブル名:m_staff code_staff   name 1        瓜坂 幸四郎 2        小野里 圭吾 3        藤原 二三四 そして、m_projectの値を検索してその結果をVector変数へと代入して、 結果として表示したいのですが、この時に現在は数字で入力されている makestaff、repstaff、workstaff、approvestaffをテーブル名の nameのcode_staffに対応する名前にしたいのですが、何かいい手は ないでしょうか?  SELECT * FROM m_staff,m_project where m_project.makestaff=m_staff.code_staff  で結合するところまではわかるのですが、Where以降で、この場合 複数の条件を指定する方法がわからないもので・・・(unionでの指定を すればいいのかもしれませんが、それもよくわからないもので)  すみませんが、宜しくお願いします。

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

  • ベストアンサー
  • Haizy
  • ベストアンサー率40% (404/988)
回答No.2

おつかれさまです。 from 句を FROM m_staff,    m_project FROM m_staff a, m_staff b,    m_projec として、where句を a.code_staff=m_project.makestaff b.code_staff=m_project.repstaff として、Select句で、 a.name, b.name を取ります。 abcd・・・(テーブルに仮の名前を付けて、同じテーブル同士で結合する。)とすれば、良いのではないでしょうか

urizaka
質問者

補足

urizakaです。 ご返答ありがとうございます。 さて、上記に従い 「select * from m_staff a,m_staff b,m_project where a.code_staff=m_project.repstaff, b.code_staff=m_project.makestaff」 と入力してみたのですが、 「サーバー : メッセージ 170、レベル 15、状態 1、行 3 行 3: ',' の近くに無効な構文があります。」 とエラーが出てきてしまいました。  やはり、Where以降で何か特別な仕組みが必要なのでしょうか? すみませんが、宜しくお願いします

その他の回答 (5)

noname#1802
noname#1802
回答No.6

補足に対する回答です。 属に言う outer結合というもので実現可能です select * from m_proj,m_staff a,m_staff b,m_staff c,m_staff d where m_proj.makestaff = a.code_staff AND m_proj.repstaff = b.code_staff AND m_proj.workstaff = c.code_staff AND m_proj.approvestaff = d.code_staff に関して言うと、、m_projテーブル を主表として m_proj にあるNULLデータも結果を持ってきます。 SQL_SERVER でどのようにSQLを記述するかわからないのですが ORACLEだと Where句に [+] で各m_staffに「補充」してあげます。

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.5

おはようございます。たびたびっ。 NULLを結果として含む時、結果にでてこないと言うことですね。 外部結合をしましょう。 where 句で指定します。 where m_proj.makestaff = a.code_staff AND m_proj.repstaff = b.code_staff AND m_proj.workstaff = c.code_staff AND m_proj.approvestaff = d.code_staff ●SQLSERVER/Access where m_proj.makestaff* = a.code_staff AND m_proj.repstaff* = b.code_staff AND m_proj.workstaff* = c.code_staff AND m_proj.approvestaff*= d.code_staff ●ORACLE where m_proj.makestaff = a.code_staff(+) AND m_proj.repstaff = b.code_staff(+) AND m_proj.workstaff = c.code_staff(+) AND m_proj.approvestaff = d.code_staff(+) としてみてください。

urizaka
質問者

お礼

urizakaです。 すっかりお世話になってしまいました、ありがとうございます。 でも、おかげで良いツールが作れそうです。 それでは。

noname#1802
noname#1802
回答No.4

補足に対する回答です。。 列名に名前をつけてあげましょう^^ select … , a.name A, b.name B, c.name C とすればできますよ。 それぞれ A = a.name B = b.name C = c.name という概念で格納されていきます。 どうでしょう?

urizaka
質問者

補足

urizakaです。 ありがとうございます、おかげでできました。 さて、これとはぜんぜん違う質問になるかもしれませんが、このようにして作ったSQL文 select * from m_proj,m_staff a,m_staff b,m_staff c,m_staff d where m_proj.makestaff = a.code_staff AND m_proj.repstaff = b.code_staff AND m_proj.workstaff = c.code_staff AND m_proj.approvestaff = d.code_staff を使って 以下のようなデータを検索した場合 code_proj projname makestaff  repstaff workstaff approvestaff 1      開発    1       2      1      2 2      購買    3                    3      支援    2       3      1      2  repstaff,workstaff,approvestaffにNull値が許容されているにも関わらず 検索される結果は1と3だけになってしまいます。で、nullの代わりにm_staffに 存在しない値0を代入するようにプログラムを組みましたが、やはり結果は同じ でした。 もちろん、code_staffの何番かを、nullの時のためのダミーにしておいて 入力がnullだった場合はそのダミーを入力するようにすればいいとは思うのですが、できればこの場合もnullでも結果を持ってくるようにしたいと思います。 そんなSQL文ってありますでしょうか?  すみませんが、ご存知でしたら教えてください。

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.3

ごめんなさい where 句 は、 AND で つなげてください (^^; where a.code_staff=m_project.makestaff and b.code_staff=m_project.repstaff

urizaka
質問者

補足

urizakaです ありがとうございます、おかげで取ってこれました。 しかしながら、この場合通常数字で表示しているmakestaffの名前も、repstaffの名前も「name」ということになってしまい、その名前だけを取ってこようとしても区別がつかなくなってしまいます。  もし、この件に関して方法をご存知でしたら教えてください。(まぁ、「Select *」で全部表示させて、何番目を変数Xに当てはめるという方法もできなくはないのですが・・・)宜しくお願いします。

  • paz777
  • ベストアンサー率47% (77/163)
回答No.1

こんにちは。 お使いの環境にはあまり詳しくはないのですが、こんなSQLではだめですか? ---------------------------------------------------- SELECT A.code_proj,A.projname,B.name,C.name,D.name,E.name FROM m_project A, m_staff B, m_staff C, m_staff D, m_staff E WHERE A.makestaff = B.code_staff AND A.repstaff = C.code_staff AND A.workstaff = D.code_staff AND A.approvestaff = E.code_staff; ---------------------------------------------------- 要はm_staffテーブルがあたかも複数あるように見せかければ良いような気がします。 (UNIONはσ(^^)もよく分かりません) ではでは・・・

関連するQ&A

  • JSPで<SELECT>の中にDBから持ってきたデータを反映させたい

    urizakaです。 現在、Jbuilder+SQL-Serverでプログラムを作っているのですが、そのなかで SELECTタグで選択できるデータはDBから持ってきたものとし、尚且つそのタグ 部分に表示される初期値がDBから持ってきたものとしたいのですが、これは どのようにすればよいのでしょうか? (DBデータ)  データベーステーブル名:m_Auth  フィールド名  code_auth name_auth 1 責任者           2 リーダー          3 一般メンバー  データベーステーブル名:m_staff  フィールド名  code_staff name code_auth 1 urizaka 1 2 fukutome 2 3 fujiwara 3 4 isezaki 3 (JSPソースコードよりSELECT部分のみ抜粋)   <SELECT name = "s_code_auth"> <% int i;  /** tantoushaallbeanはこのJSPで使うメソッドが入ったBeanファイルです**/ for( i = 0; i < tantoushaallbean.getcode_auth().size(); i++ ){ out.println("<option value=\"" + /** 下記はcode_authを全て持ってくるメソッドです**/ tantoushaallbean.getcode_auth().elementAt(i) + "\">" + /** 下記はname_authを全て持ってくるメソッドです**/ tantoushaallbean.getnameauth().elementAt(i) + "</option>" ); } %> </SELECT> 現在では、SELECTタグで選択できるデータはDBから持ってきたものが表示 されますが、初期状態はDB「m_staff」のcode_authがどの値であろうと、 code_authが1の責任者になっている状態です。  すみませんが、上記の件について方法をご存知の方がいらっしゃったら ぜひ宜しくお願いします。

    • ベストアンサー
    • Java
  • ORACLE 効率の良いDB設計について

    複合キーとはこういう時に使うのでしょうか? テーブルが2つあるとします。 テーブルAは、CODE テーブルBは、CODE1,CODE2,NAME とします。 テーブルAの"CODE"とテーブルBの"CODE1"+"CODE2"をキーに テーブルBの"NAME"を取得する場合。 たとえばテーブルAのCODEに"A1B1"という値が入っていて テーブルBのCODE1,CODE2の値にそれぞれ、"A1"、"B1"が入っている場合、テーブルBの主キーはCODE1とCODE2の二つにした方が効率がいいですか? select テーブルA.code,テーブルB.name from テーブルA,テーブルB where テーブルA.code = テーブルB.code1 || テーブルB.code2 ↑あっているかちょっと自信がないですが こういった処理をしたいと思っています。 よろしくお願い致します。

  • 複数のPKを持つテーブル同士の結合について

    以下のような2つのPKを持つテーブル同士で、お互いに存在しないPKのデータを抽出するときのSQLを教えて下さい。 以下のデータの場合、テーブルAではCODE_1がAAAAAのデータ、テーブルBではCODE_1がCCCCCのデータのことを指します。 [テーブルA] CODE_1 CODE_2 ----- --- AAAAA 123 BBBBB 123 [テーブルB] CODE_1 CODE_2 ----- --- BBBBB 123 CCCCC 123 PKがCODE_1だけの場合は、 select distinct テーブルA.CODE_1 from テーブルA,テーブルB where テーブルA.CODE_1 not in ( select テーブルA.CODE_1 from テーブルA,テーブルB where テーブルA.CODE_1 = テーブルB.CODE_1) で、AAAAAが抽出できるとこまでは分かったんですが、複数のPKになったらいきなり分からなくなってしまいました。 どうかよろしくお願いします。

  • 複数テーブルからselect

    sql初心者です。 複数テーブルからselectする書き方が解らず質問です。 ユーザーtable user_code | name | address ------------------------------- 1 | 山田 | 北海道 2 | 高橋 | 東京 3 | 鈴木 | 仙台 4 | 岡田 | 北海道 来店table raiten_code | user_code | raiten_date ------------------------------- 1 | 1 | 2011/05/23 2 | 3 | 2011/08/05 3 | 4 | 2011/08/05 4 | 2 | 2011/08/05 5 | 1 | 2011/10/09 6 | 1 | 2011/08/05 とテーブルがあったとして、 北海道に住むお客様 + 2011/08/05の日付指定で来店記録を拾いだしたいと思っています。 (5日に来店の北海道の方) SELECT * FROM ユーザーtable WHERE address='北海道' union SELECT * FROM 来店table WHERE visit_date ='2011/08/05'; unionにマージとあったので、多分違いそうだなと思いつつ、試してみましたが、うまくいかずにいます。 mysqlのリファレンスマニュアルなども色々見ているのですが、答えにたどり着けません。 なにかヒントのようなものでもかまいませんので、お助けいただけると助かります。

    • ベストアンサー
    • MySQL
  • UPDATE

    ORACLE9i テーブル名 TABLE1 フィールド名  CODE マスタ テーブル名 MST フィールド名 CODE2 フィールド(CODE)の値とマスタのコード(CODE2)の値が同じであれば、マスタのコード(CODE2)の値をフィールド(CODE)に入れるのと、マスタデータが無い場合はNULLをいれたいのですが、マスタに無い場合の処理がわからないので おしえてください。 UPDATE TABLE1 SET CODE = MST.CODE2 WHERE TABLE1.CODE = MST.CODE2

  • 【PHP】複数語検索について

    お世話になります。 PHPにて複数語検索を行いたいのですが、うまく検索できずに困っています。 テーブル名はinformation、 レコード名はnameとして、スペース区切りで検索します。 $st = $db->prepare("SELECT * FROM information"); $where = array(); if($arr['name']){ $name_ary = explode(" ", $name); $name_count = count($name_ary); $where = ""; for( $i = 0; $i < $name_count; $i++ ){ if( $i != 0 ){ $where = ($where . " or"); } $where = $where . " name LIKE '%{$name_ary[$i]}%'"; } } $query= sprintf("SELECT * FROM information WHERE $where"); $st = $db->prepare($query); どなたかご教授いただけないでしょうか? 他の質問など見て真似たり、下記サイトを参考にしたりしているのですが、 うまくいかず困っております。 http://blog.olivesystem.com/824.html 何卒宜しくお願い致します。

    • 締切済み
    • PHP
  • SELECTのスピード

    SELECTのスピードでどの方法が 検索スピードが速いのか教えてもらいたいのですが Aのテーブル DENNO CODE Bのテーブル CODE NAME Aのテーブルを主にAのCODEでBのテーブルを参照したい時 (1) SELECT A.DENNO,A.CODE, (SELECT B.NAME from B where A.CODE=B.CODE) AS NAME from A (2) SELECT A.DENNO,A.CODE,B.NAME FROM A LEFT JOIN B ON A.CODE=B.CODE (3) SELECT A.DENNO,A.CODE,B.NAME FROM A , B WHERE A.CODE=B.CODE(+)

  • SELECT分での結果の取り出し方

    以下の様なテーブルから SELECT分で条件をWHERE CODE = '0001' の様に指定して 求まった結果を1つの文字列にしたいのですが 良い方法がありましたら、教えて下さい。 SELECT * from testtbl; CODE NAME ------------------------------- 0001 AAAA 0001 BBBB 0002 CCCC 0003 DDDD この例だと、 SELECT NAME FROM testtbl WHERE CODE = '0001'の様な形で NAMEの部分の結果として,'AAAA,BBBB'の文字列を取得したいです。 ファンクションとかで実現できるでしょうか?

  • SQL文の実行速度について

    こんにちは。SQLを勉強しています。 質問をさせてください。 Oracleテーブル(test_table:レコード数はかなりあると考えて構いません) にnumber(int),value(varchar), code(varchar)の3つのフィールドが存在 するとします。 今、codeを指定してvalueを取得したいと考えています。 (1)---------------------------- select value from test_table where code='001'; select value from test_table where code='002'; select value from test_table where code='003'; (2)---------------------------- select code, value from test_table where code='001' or code='002' or code='003' (1)と(2)ではどちらが実行速度が速いのでしょうか? 実際に実行すればわかることですが、そういった環境が ないので、確認できません。宜しくお願い致します。

  • 複数テーブルからのデータ取得方法

    SQL初心者ですが、教えてください。 (oracle10g を使用します) 下記の様なテーブルがあります。 テーブル名  カラム名 MEIBO    NAME, TYPE, HOME_CODE, OFFICE_CODE HOME     HOME_CODE, HOME_ADR, HOME_TEL OFFICE    OFFICE_CODE, OFFICE_ADR, OFFICE_TEL MEIBOテーブルのTYPEが1の場合、HOME_CODEをキーとして、HOMEテーブルより HOME_ADRとHOME_TELを取得、 MEIBOテーブルのTYPEが2の場合、OFFICE_CODEをキーとして、OFFICEテーブルよりOFFICE_CODE,OFFICE_ADR,OFFICE_TELを取得し、 下記のイメージのように出力をしたいです。 NAME TYPE   ADR    TEL -------------------------------------- 山田  1    東京都… 03-XXXX-XXXX 鈴木  2    神奈川県 045-XXX-XXXX 以上です。 ご存知の方いらっしゃいましたら よろしくお願い致します。