アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなテーブルがあって、時間帯がかぶっているレコードを
クエリで抽出したいと考えております。

≪tbl_配置一覧≫
ID  日付    勤務地  開始時間 終了時間  担当者
1  2009/9/2   東京   10:00  12:00  Aさん
2  2009/9/2   東京   13:00  14:00  Aさん
3  2009/9/2   神田   12:30  14:00  Bさん
4  2009/9/2   神田   09:00  11:00  Aさん

ID1と4のように同じ担当者が時間帯がかぶる形で勤務予定となっている場合、このレコード二つをクエリで抽出したいと考えております。

いろいろ探して下記のようなSQL文を書いてみたのですが、どうもうまくいきません。

SELECT tbl_配置一覧.ID, tbl_配置一覧.日付, tbl_配置一覧.勤務地, tbl_配置一覧.開始時間, tbl_配置一覧.終了時間, tbl_配置一覧.担当者
FROM tbl_配置一覧, tbl_配置一覧 AS tbl_配置一覧_1
WHERE (((tbl_配置一覧.ID)<>[tbl_配置一覧_1].[id]) AND ((tbl_配置一覧.日付)=[tbl_配置一覧_1].[日付]) AND ((tbl_配置一覧.勤務地)=[tbl_配置一覧_1].[勤務地]) AND ((tbl_配置一覧.開始時間)<[tbl_配置一覧_1].[終了時間]) AND ((tbl_配置一覧.終了時間)>[tbl_配置一覧_1].[開始時間]))
ORDER BY tbl_配置一覧.ID;

大変申し訳ないですが、ご教授よろしくお願いいたします。

A 回答 (2件)

#1の方の回答にあるように、勤務地を担当者に変更することでサンプル上は動くと思います。


(以下は書き方を変更しただけなので同じものになります)

SELECT Q1.* FROM tbl_配置一覧 AS Q1, tbl_配置一覧 AS Q2
WHERE
Q1.ID <> Q2.ID
AND Q1.日付 = Q2.日付
AND Q1.担当者 = Q2.担当者
AND Q2.開始時間 < Q1.終了時間
AND Q2.終了時間 > Q1.開始時間
ORDER BY Q1.ID;


これは直積を使ったやり方です。(直積については以下参照)
http://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82% …

ここでサンプルにデータ(ID=5)を1つ追加してみます。

ID  日付    勤務地  開始時間 終了時間  担当者
1  2009/9/2   東京   10:00  12:00  Aさん
2  2009/9/2   東京   13:00  14:00  Aさん
3  2009/9/2   神田   12:30  14:00  Bさん
4  2009/9/2   神田   09:00  11:00  Aさん
5  2009/9/2   秋葉原  10:30  11:30  Aさん

ここでは、1,4,5 を抽出する必要があります。
上記SQLを実行すると

ID  日付    勤務地  開始時間 終了時間  担当者
1  2009/9/2   東京   10:00  12:00  Aさん
1  2009/9/2   東京   10:00  12:00  Aさん
4  2009/9/2   神田   09:00  11:00  Aさん
4  2009/9/2   神田   09:00  11:00  Aさん
5  2009/9/2   秋葉原  10:30  11:30  Aさん
5  2009/9/2   秋葉原  10:30  11:30  Aさん

となります。
なぜかは、SELECT Q1.* FROM・・・ を SELECT * FROM・・・ に変更して他のフィールドを実際にみてください。


ここで 1,4,5 を抽出する一例は以下。

SELECT * FROM tbl_配置一覧 AS Q1
WHERE
EXISTS (
SELECT 1 FROM tbl_配置一覧 AS Q2
WHERE
Q1.ID <> Q2.ID
AND Q1.日付 = Q2.日付
AND Q1.担当者 = Q2.担当者
AND Q2.開始時間 < Q1.終了時間
AND Q2.終了時間 > Q1.開始時間
)
ORDER BY Q1.ID;

※なお、このクエリは編集できます。


※時間帯がかぶるのは、あっても2つまでであれば、そのままでもよいと思います。

参考URL:http://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82% …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
めちゃくちゃわかりやすい回答で、問題が解決したばかりではなく、次につながるような知見も得る事が出来ました。
心より感謝しております。
私も似たような立場があれば、見習わなければと思いました。。。

お礼日時:2009/09/08 18:17

示されたSQL文は勤務地が同じときで比較してます。

そのためサンプルのデータでは対象なしとなります。
勤務地ではなく担当者が同じときとすべきでは?
    • good
    • 0

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