- - PR -
JOINを使ったリレーションでwhere
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-10-23 09:30
いつもお世話になります。テーブル構成
*** syainmasta *** syainid(int) | simei(char100) | juusyo(char200) *** yesnos *** syainid(int) | istaisyoku(bool) | isyakuin(bool) があるときに、syainidでリレーションしてistaisyokuがFALSEの情報だけを抜き出したいときのSQLを考えてるのですが、なかなかできません。イメージしてたのは、 select * from syainmasta sm left join yesnos yn on sm.syainid=yn.syainid where yn.istaisyoku=false です。これだと、syainmastaにあるsyainidとyesnosにあるsyainidが同じようにないと正しい情報が抜き出せないんですね。社員マスタテーブルとその他の情報テーブルの行数が違う場合の結合方法が知りたいです。説明が不十分で申し訳ないです。どなたかよろしくお願いします。 | ||||||||
|
投稿日時: 2004-10-23 13:34
説明が全然分からん。
「istaisyokuがFALSEの情報だけを抜き出したいとき」って書いてあるけど本当? であれば、あなたの書いているクエリは正しいはずだけど。(外部結合じゃなくて内部結合で十分なんだけどさ。) もしも、syainmasta の全行を取り出したいのなら、こうする。
| ||||||||
|
投稿日時: 2004-10-25 09:43
ご返答ありがとうございます。説明が下手で申し訳ないです。
今は応急策というかホントはこの方がいいのかも知れないですが、syainmastaテーブルとyesnosテーブルのsyainidを同じにしています。内部結合でも外部結合でも行数が同じな状態、全社員分のyesnos情報がある状態にしました。 前回の書き込みで、「istaisyokuがFALSEの情報だけを抜き出したいとき」って書いてあるけど本当?とご指摘がありましたが、御察しのとおり、「TRUE以外の場合」の情報がほしかったのです。困惑させてしまって申し訳ないです。 istaisyokuがTRUEの場合、その社員は退職済みなので、退職していない社員を表示するという処理をしたかったのです。 データベース立ち上げ以来、退職した人間の情報のみyesnosに情報を追加していたので、yesnosには退職者の情報しか入っていなかったのです。syainmastaとyesnosのレコード数はぜんぜん違うので、istaisyoku=TRUE以外の情報といえば、FALSEとNULLができてしまいます。「TRUE以外」の記述方法がnot(TRUE)とかでやってみてもできなかったので質問させていただきました。 そもそもsyainmastaテーブルとyesnosのレコード数は一緒のほうがいいのでしょうか? | ||||||||
|
投稿日時: 2004-10-25 10:15
であれば、該当部分を
とすればNULL(yesnosに存在しないもの)も含めることができます。 | ||||||||
|
投稿日時: 2004-10-25 10:19
istaisyokuがTRUEの場合を除けばいいんですよね。
select * from syainmasta where syainid not in (select syainid from yesnos where istaisyoku = true) これでどうですか? レコード数は同じでなくても大丈夫ですよ。 | ||||||||
|
投稿日時: 2004-10-25 11:21
皆様、とても勉強になります。どちらの方法でも希望通りの結果が得られました。最初に環境を書いておかなければならなかったのですが、書き忘れておりました。MYSQL4.1.5gammaです。
select * from syainmasta where syainid not in (select syainid from yesnos where istaisyoku = true) の、()で囲ってある部分ってサブクエリじゃないんですか?MYSQLはサブクエリが使えないっていう認識だったもので・・・。もしかして勘違い?失礼しました。 今後のためにも教えていただきたいのですが、yesnosの情報は、社員数分情報を作ったほうがいいのか、それとも今回のSQLのように該当する部分だけ追加する形でもよいのでしょうか? JAVAでWEBアプリを作っています。更新が結構あるものですから、どちらのほうがメンテナンス性がいいのかなと思いまして。よろしくお願いします。 [ メッセージ編集済み 編集者: take 編集日時 2004-10-25 11:23 ] | ||||||||
|
投稿日時: 2004-10-25 17:49
MySQL バージョン 4.1 以降では、標準 SQL で規定されているサブクエリのすべての形式と操作がサポートされました。
質問のyesnosの情報ですが、社員数分情報を持つならば、syainmasta と表を分ける必要が無いですよね。 メンテナンス性も一つの表の方がわかりやすいですよね。 ただ、表を分けるのは、分けるだけの理由があるはずです。 その辺の詳しい事情がわからないと、最終的な答えは出ないと思います。 ただし、まったく同じ社員数分のデータを持っているのなら、 表を分けると、効率も悪くなると思いますが、いかがですか? | ||||||||
|
投稿日時: 2004-10-25 17:51
MYSQLで使えないのはインラインビューではなかったでしたっけ?
サブクエリーは確か問題ないはず [ メッセージ編集済み 編集者: 名無18号 編集日時 2004-10-25 17:53 ] |
1