- ベストアンサー
複数検索について
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での指定を すればいいのかもしれませんが、それもよくわからないもので) すみませんが、宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
おつかれさまです。 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・・・(テーブルに仮の名前を付けて、同じテーブル同士で結合する。)とすれば、良いのではないでしょうか
その他の回答 (5)
補足に対する回答です。 属に言う 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)
おはようございます。たびたびっ。 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です。 すっかりお世話になってしまいました、ありがとうございます。 でも、おかげで良いツールが作れそうです。 それでは。
補足に対する回答です。。 列名に名前をつけてあげましょう^^ select … , a.name A, b.name B, c.name C とすればできますよ。 それぞれ A = a.name B = b.name C = c.name という概念で格納されていきます。 どうでしょう?
補足
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)
ごめんなさい where 句 は、 AND で つなげてください (^^; where a.code_staff=m_project.makestaff and b.code_staff=m_project.repstaff
補足
urizakaです ありがとうございます、おかげで取ってこれました。 しかしながら、この場合通常数字で表示しているmakestaffの名前も、repstaffの名前も「name」ということになってしまい、その名前だけを取ってこようとしても区別がつかなくなってしまいます。 もし、この件に関して方法をご存知でしたら教えてください。(まぁ、「Select *」で全部表示させて、何番目を変数Xに当てはめるという方法もできなくはないのですが・・・)宜しくお願いします。
- paz777
- ベストアンサー率47% (77/163)
こんにちは。 お使いの環境にはあまり詳しくはないのですが、こんな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はσ(^^)もよく分かりません) ではでは・・・
補足
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以降で何か特別な仕組みが必要なのでしょうか? すみませんが、宜しくお願いします