dポイントプレゼントキャンペーン実施中!

AのSQLでヒットし、BのSQLでヒットしないレコードを抽出したいと思います。
イメージとしては、内線(tel)30..のみを使用している社員(employee)を抽出したいと思います。

【AのSQL(内線(tel)30..を使用している社員(employee))】
SELECT `employee` FROM `w_table` WHERE `tel` REGEXP '30..'

【AのSQLの結果】
employee
10001
10001
10002
10002


【BのSQL(内線(tel)30..以外を使用している社員(employee))】
※※※1.ここの書き方が分かりません。※※※

【BのSQLの結果】
employee
10001
10003


【CのSQL(AのSQLを満たし、BのSQLを満たさない社員)】
※※※2.ここの書き方が分かりません。※※※
【CのSQLの結果】
employee
10002


上記の場合、
社員番号10001は内線30..と内線30..以外を使用しています。
社員番号10002は内線30..のみを使用しています。
社員番号10003は内線30..以外を使用しています。

この場合、社員番号10002のみを抽出したいと思います。

その為、【CのSQL】を記述しようと思ったのですが、
どのように SQL 文を記述すればよいか分からなかったので、
記述方法についてアドバイスいただける方がいらっしゃいましたら、
ご教示の程、よろしくお願いします。

なお、【AのSQL】【BのSQL】を書かず、
直接【CのSQL】一回で済む物であれば非常に助かります。

以上、よろしくお願いします。

A 回答 (4件)

センスのない回答ですがとりあえず試しに



SELECT `employee`
,SUM(IF(`tel` REGEXP '30',1,0)) AS OK
,SUM(IF(`tel` REGEXP '30',0,1)) AS NG
FROM `w_table`
GROUP BY `employee`

とすると
OK>0でNG>0なら30もそれ以外もつかっている
OK>0でNG=0なら30だけを使っている
OK=0でNG>0なら30以外しか使っていない

したがって30だけしか使っていないのは
SELECT `employee`
FROM `w_table`
GROUP BY `employee`
HAVING SUM(IF(`tel` REGEXP '30',1,0)) >0
AND SUM(IF(`tel` REGEXP '30',0,1)) =0

みたいな感じ?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教示いただいたSQL文で意図した動作になったと思います。

このたびはどうもありがとうございました。

お礼日時:2010/11/12 18:21

select distinct employee from w_table a


where not exists
select * from w_table b
where a.employee=b.employee and tel not regexp '30..');
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

下記のSQL文で意図した動作になったと思います。
このたびはどうもありがとうございました。

select distinct employee from w_table a
where not exists
(select * from w_table b
where a.employee=b.employee and tel not regexp '30..');

お礼日時:2010/11/12 18:27

mysqlを触ったことがないので実行可能なSQLかわかりませんが、



SELECT `employee`
FROM `w_table`
GROUP BY employee
HAVING count(distinct tel) = 1
and count(case when `tel` REGEXP '30..' then null else 1 end) = 0;

こんな感じではどうでしょうか?
使用内線の数が一つかつ条件に当てはまらない内線番号の数が0のデータを抽出するイメージです。
的外れだったらすみません。。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

実行可能なSQLである事は確認しました。
ただし、使用内線の数が一つという条件はありませんでした。

以上、よろしくお願いします。

お礼日時:2010/11/12 18:25

検索されるレコードのカラムを教えてください。



内線番号は1カラムですか?複数カラムあるのですか?つまり社員番号一つに一つの内線番号になっているのですか?それとも複数のカラムに設定されているのですか?
もし、一つのカラムで複数の内線番号を設定いるのなら格納方法を教えてください。

この回答への補足

ご回答ありがとうございます。

テーブルは下記のような感じです。
―――――――――――
|id|employee|tel |
―――――――――――
|1 | 10001 |3001|
|2 | 10001 |3002|
|3 | 10001 |4001|
|4 | 10002 |3001|
|5 | 10002 |3001|
|6 | 10003 |4002|
―――――――――――

その為、内線番号は1カラムで、社員番号一つにつき、一つの内線番号となります。
ただし、社員番号は複数レコードあります。

以上、よろしくお願いします。

補足日時:2010/11/12 17:48
    • good
    • 0

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