• ベストアンサー

[Access]時間帯の重複チェック

下記のようなテーブルがあって、時間帯がかぶっているレコードを クエリで抽出したいと考えております。 ≪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; 大変申し訳ないですが、ご教授よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.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%E4%BB%A3%E6%95%B0#.E7.9B.B4.E7.A9.8D ここでサンプルにデータ(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%E4%BB%A3%E6%95%B0#.E7.9B.B4.E7.A9.8D
310ry
質問者

お礼

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

その他の回答 (1)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

示されたSQL文は勤務地が同じときで比較してます。そのためサンプルのデータでは対象なしとなります。 勤務地ではなく担当者が同じときとすべきでは?

関連するQ&A

専門家に質問してみよう