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での指定を
すればいいのかもしれませんが、それもよくわからないもので)
 すみませんが、宜しくお願いします。

A 回答 (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・・・(テーブルに仮の名前を付けて、同じテーブル同士で結合する。)とすれば、良いのではないでしょうか

この回答への補足

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以降で何か特別な仕組みが必要なのでしょうか?
すみませんが、宜しくお願いします

補足日時:2001/07/18 16:30
    • good
    • 0

補足に対する回答です。


属に言う 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に「補充」してあげます。
    • good
    • 0

おはようございます。

たびたびっ。

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(+)

としてみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/07/19 15:51

補足に対する回答です。


列名に名前をつけてあげましょう^^

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文ってありますでしょうか?
 すみませんが、ご存知でしたら教えてください。

補足日時:2001/07/19 10:29
    • good
    • 0

ごめんなさい



where 句 は、
AND で つなげてください (^^;


where a.code_staff=m_project.makestaff
and b.code_staff=m_project.repstaff

この回答への補足

urizakaです
ありがとうございます、おかげで取ってこれました。

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

補足日時:2001/07/18 18:24
    • good
    • 0

こんにちは。


お使いの環境にはあまり詳しくはないのですが、こんな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はσ(^^)もよく分かりません)
ではでは・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Q【SQL文】 where (colA & colB) in ((1 & 1), (2 & 2)) とは?

VB6のプログラムを読んでいたら、ACCESSのMDBにSQL文を
投げる際に以下のような記述がありました。

------------------------------------------------------
select * from tableA
where (colA & colB) in ((1 & 1), (2 & 2))
------------------------------------------------------

これはどういったことを表しているのでしょうか?

雰囲気的には
(colA, colB) の組み合わせが (1, 1) か (2, 2)
というようなことを表しているのかなと思うのですが
はっきりとわからなかったため質問させていただきました。

また、これはOracle等の他のDBでも使用できる構文
なのでしょうか?

ご存知の方がいらっしゃいましたら教えていただけたらと
思います。

Aベストアンサー

<IN=集合>

WHERE節のキーワード INに値を列挙することで、その値を持つ列を抽出することができます。

<列名> [NOT] IN (<値1>,<値2>,...<値n>,)

SELECT * FROM 得意先一覧 WHERE 郵便番号 IN ('8300001', '8300002')

Informix、SQL Sever では、このように書きます。
ですから、構文としては共通した書き方です。
ただし、Access では、演算子をSQLのそれでなくVBAのそれが通用します。

・文字列の加算・・・&
・'11' と 11とで型照合エラーが発生しない。

などです。

ですから、Access 以外では、次のような書き方が一般的。

[イミディエイト]
? DBSelect("SELECT * FROM A WHERE 列1+列2 IN ('1'+'1', '2'+'2')")
1;2;2;
2;1;1;

この場合、列1と列2の組合せが1+1、2+2 を取得しています。

ただし、示されているコードはバグに近い書き方です。

[イミディエイト]
? DBSelect("SELECT * FROM A WHERE 列1+列2 IN ('11'+'11', '22'+'22')")
1;11;11;
2;22;22;
3;111;1;

[イミディエイト]
? DBSelect("SELECT * FROM A WHERE 列1+'/'+列2 IN ('11/11', '22/22')")
1;11;11;
2;22;22;

この2つではヒットするレコードが違います。
ちょっと、問題ありかと思います。

<IN=集合>

WHERE節のキーワード INに値を列挙することで、その値を持つ列を抽出することができます。

<列名> [NOT] IN (<値1>,<値2>,...<値n>,)

SELECT * FROM 得意先一覧 WHERE 郵便番号 IN ('8300001', '8300002')

Informix、SQL Sever では、このように書きます。
ですから、構文としては共通した書き方です。
ただし、Access では、演算子をSQLのそれでなくVBAのそれが通用します。

・文字列の加算・・・&
・'11' と 11とで型照合エラーが発生しない。

などです。

ですから、Access...続きを読む

QODBC経由でMySQL5.0に auto_increment属性などを付加したテーブルを作成したい

ODBC経由でMySQL5.0に auto_increment属性など付加した以下のテーブルを作成したいのですがODBCのSQL文はどう書けばよいのでしょうか?

DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS test (
a1 int(11) NOT NULL auto_increment,
b1 enum('public','group','private') NOT NULL default 'public',
c1 date NOT NULL default '0000-00-00',
d1 mediumtext NOT NULL,
PRIMARY KEY (`a1`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

よろしくお願いします。

Aベストアンサー

MySQLのODBCドライバを入手していて、その使い方についての質問ですか?

MySQLのマニュアル(5.0版は英文しかないようなので、5.1版)
http://dev.mysql.com/doc/refman/5.1/ja/connectors.html

MySQLのODBCドライバのダウンロード
http://dev.mysql.com/downloads/connector/odbc/3.51.html

QAccess_VBA_記述方法

AccessVBAの記述方法で悩んでいます。
複数のテーブルを順読みして、レコードの更新/追加/削除のプログラムを作成していますが、順読みなので何も入っていないテーブルのレコードも読みに行ってしまいデバックとして出てしまいます。
EOFやNULLをどうにかして判断条件として記述してみましたが、やはり上手くいきませんでした。
レコードでの判断条件では無く、テーブル内にレコードが存在するかどうかという判断文と条件文の記述方法がありましたら、どうか教えて下さい。
宜しくお願い致します。

Aベストアンサー

○案1
Dim cnt
cnt = Dcount("*", "[テーブル名]")
If cnt > 0 Then
' レコードがあるテーブルになにかする
End If

とDcount関数を使えばどうでしょうか。

○案2
また複数のテーブルが同じフィールドを含むならば
ユニオンクエリで1つのテーブルにしてから扱うことも
簡単だと思います。

Qユーザーテーブルとシステムテーブルを区別したい

カテゴリーが違ったらすみません。

VC++のプログラムで
SQLTables,SQLBindCol関数を使ってDB上のテーブル名の一覧を取得しています。
この時、システムテーブル(例えば、AccessならMSys_...,Oracle9なら_ALL_INSTANTIATION_DDL等)も取得してしまいます。
ユーザーが生成したテーブルだけの一覧を作りたいので困っています。
ユーザーが生成したテーブルとシステムテーブルを区別する方法があったら教えて下さい。

Aベストアンサー

SQLBindCol(hstmt,3,SQL_C_CHAR,tableName

てな事をしていると思いますが、

SQLBindCol(hstmt,4,SQL_C_CHAR,tableType

みたいにして、テーブルタイプが取れます。

後はループの中で "SYSTEM TABLE"(だったかな)をオミット。

ここよか、言語系カテで。

QACCESS ACCESS VBA テーブル テーブル変換 番号 個数 変換

私はプログラム初心者です。
業務の中でACCESSを使っております。
ACCESSでテーブルの変換についてのプログラムが分からなかったので
質問させて頂きました。


以下のようなテーブル(テーブル1)があります。
管理番号|NO|名前
1|NO.1|スプーン
2|NO.2|スプーン
3|NO.3|スプーン
4|NO.1|フォーク
5|NO.2|フォーク
6|""|ナイフ
7|NO.1|お鍋
以上のテーブルを新たにテーブル(テーブル2)を作成し、次のようなにしたいです。
管理番号|台数|名前
1|3|スプーン
4|2|フォーク
6|1|ナイフ
7|1|お鍋

テーブル変換の機能
・名前が同じ物の個数を表示する
・名前が同じ物の管理番号は若い番号にする

よろしくお願いいたします。

Aベストアンサー

Access2003でのクエリ作成手順になります。(他バージョンでもほぼ同じでしょう)

・「デザインビューでクエリを作成する」から対象のテーブルを表示させます。

・クエリデザインツールバーにある「Σ」をクリックします。
 (デザインの欄に「集計」が追加されます)

 もしくは、クエリの種類を1度「クロス集計」にし、「選択」に戻しても同じ状態になります。

・テーブル内の「管理番号」をダブルクリックします。
 フィールドに「管理番号」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。
 集計のところを「最小」に変更します。
 並べ替えのところを「昇順」に変更します。

・テーブル内の「NO」をダブルクリックします。
 フィールドに「NO」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。
 集計のところを「カウント」に変更します。

・テーブル内の「名前」をダブルクリックします。
 フィールドに「名前」、テーブルに対象テーブル名、集計に「グループ化」が表示されます。

・ここで、表示を「データシートビュー」に切り替えます。(注1)
 管理番号の最小、NOのカウント、名前 の表が表示されます。
 名前「ナイフ」部分のカウントが得たいものではなく「0」になっています。
 これは、NULLのデータはカウント対象外となっているためです。

・表示を「SQLビュー」に切り替えます。
 1行目中ほどに 「 Count(テーブル名.[NO]) AS NOのカウント, 」があります。
 NOに限定した個数を求めるのでなく、単にレコード数を得たいので
 これを 「 Count(*) AS 台数, 」に書き換えます。
 XXXXX AS YYYY は、XXXXXをYYYY名で、という意味合いになるので、
 同様に「管理番号の最小」->「管理番号」に修正します。

・表示を「データシートビュー」に切り替えます。

これで求めたいクエリは作成することができました。
このクエリをそのまま使うのではなく、結果をテーブルに書き出すには続いて以下を行います。

・表示を「クエリ デザイン」に切り替えます。

・メニューの「クエリ」->「テーブル作成」をクリックします。
 テーブル名を入力し、「OK」

 クエリデザイン上変化はありませんが、以上で終了です。

確認)
表示を「SQLビュー」に切り替えます。
1行目最後あたりに、「 INTO テーブル名 」が追加されています。
これが結果をテーブルに書き出す命令部分になります。


(注1)
「'*'で選択したフィールドはグループ化できません。」というメッセージが出たら、クエリ作成をいったんあきらめます。
(クエリデザインの画面を閉じます)
メニューの「ツール」->「オプション」の「テーブル/クエリ」タブの「クエリ デザイン」部分の「全てのフィールドを表示する」チェックを外し「OK」します。
クエリ作成を初めからやり直します。

(注2)
(注1)の変更は、以降も変更されたままとなるので、今回だけ回避するには、
表示を「SQLビュー」にし、1行目最後の「 テーブル名.名前, * 」の「 , * 」を削除します。


書く練習がてら、初心者向けに書いてみましたがいかがでしたでしょうか。

Access2003でのクエリ作成手順になります。(他バージョンでもほぼ同じでしょう)

・「デザインビューでクエリを作成する」から対象のテーブルを表示させます。

・クエリデザインツールバーにある「Σ」をクリックします。
 (デザインの欄に「集計」が追加されます)

 もしくは、クエリの種類を1度「クロス集計」にし、「選択」に戻しても同じ状態になります。

・テーブル内の「管理番号」をダブルクリックします。
 フィールドに「管理番号」、テーブルに対象テーブル名、集計に「グループ化」...続きを読む


人気Q&Aランキング

おすすめ情報