- PR -

JOINを使ったリレーションでwhere

1
投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 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/09/17
投稿数: 667
投稿日時: 2004-10-23 13:34
説明が全然分からん。

「istaisyokuがFALSEの情報だけを抜き出したいとき」って書いてあるけど本当? であれば、あなたの書いているクエリは正しいはずだけど。(外部結合じゃなくて内部結合で十分なんだけどさ。)

もしも、syainmasta の全行を取り出したいのなら、こうする。
コード:
select * from syainmasta sm
 left join yesnos yn on sm.syainid=yn.syainid and yn.istaisyoku=false


take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 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のレコード数は一緒のほうがいいのでしょうか?
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-10-25 10:15
引用:

前回の書き込みで、「istaisyokuがFALSEの情報だけを抜き出したいとき」って書いてあるけど本当?とご指摘がありましたが、御察しのとおり、「TRUE以外の場合」の情報がほしかったのです。


であれば、該当部分を
コード:
(yn.istaisyoku=false or yn.istaisyoku is null)


とすればNULL(yesnosに存在しないもの)も含めることができます。
hidemaru
常連さん
会議室デビュー日: 2004/03/22
投稿数: 44
投稿日時: 2004-10-25 10:19
istaisyokuがTRUEの場合を除けばいいんですよね。

select * from syainmasta
where syainid not in (select syainid from yesnos where istaisyoku = true)

これでどうですか?
レコード数は同じでなくても大丈夫ですよ。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 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 ]
hidemaru
常連さん
会議室デビュー日: 2004/03/22
投稿数: 44
投稿日時: 2004-10-25 17:49
MySQL バージョン 4.1 以降では、標準 SQL で規定されているサブクエリのすべての形式と操作がサポートされました。

質問のyesnosの情報ですが、社員数分情報を持つならば、syainmasta と表を分ける必要が無いですよね。
メンテナンス性も一つの表の方がわかりやすいですよね。
ただ、表を分けるのは、分けるだけの理由があるはずです。
その辺の詳しい事情がわからないと、最終的な答えは出ないと思います。
ただし、まったく同じ社員数分のデータを持っているのなら、
表を分けると、効率も悪くなると思いますが、いかがですか?
名無18号
会議室デビュー日: 2004/07/27
投稿数: 19
投稿日時: 2004-10-25 17:51
MYSQLで使えないのはインラインビューではなかったでしたっけ?
サブクエリーは確か問題ないはず

[ メッセージ編集済み 編集者: 名無18号 編集日時 2004-10-25 17:53 ]
1

スキルアップ/キャリアアップ(JOB@IT)