2011-05-11 16 views
3

私は自分自身に対して照会しようとしているテーブルを持っています。Oracleの範囲とサブクエリ

テーブル名:スケジュール

  • USER_ID
  • STARTDATE
  • ENDDATE
  • sequencyID

状況は、私は= 0 USER_IDこれは表す行数を有しています誰かが主張できるオープンなスケジュール。スケジュールが要求されると、特定のユーザーIDが割り当てられます。ここでは、難しい部分が入っています。私は、ユーザーを選び、すでに受け入れられているかスケジュールされているものと重複しないスケジュール時間を表示しようとしています。ここで

は時代のすべての範囲は、人はすでに

SELECT * 
    FROM schedule 
WHERE user_id = 0; 

を受け入れた。これは私に可能なすべてのスケジュールの行を取得し、私を取得することを、私がこれまで持っているもの

SELECT * 
    FROM schedule 
WHERE user_id = 123456; 

です。私は、最終結果がuser_id = 0というスケジュール要素のリストであり、startdateとenddateがすでにユーザーに割り当てられているものから始まり終わりまで存在しないようにそれらをどのように組み合わせるかについてはあまりよく分かりません。

私はそれが

SELECT * 
    FROM schedule 
WHERE user_id = 0 
    AND (loop through schedule rows testing for 
      (startdate < loopstartdate and enddate < loopstartdate) || 
      (startdate > loopenddate) 

私が何を苦労されたザ・ようなものになるだろうと思うだろう。何か案は?誰かが少なくとも私がどのようなメカニズムを正しい方向に向けることができれば、私はこのタイプの問題を解決するのに使い始めるのがすばらしいだろう。

答えて

2
SELECT a.* 
FROM schedule a 
WHERE user_id = 0 
    AND NOT EXISTS (
    SELECT NULL 
     FROM schedule b 
     WHERE b.user_id = 123456 
     AND b.start_date <= a.end_date 
     AND b.end_date >= a.start_date 
) 
+0

私はかなりの量のデータをテストしましたが、これは完璧に機能しました!!!!! – Doug

0

私はこれがうまくいくと思います。私は実際に私がどこにいるかをテストすることはできませんが、それを撮影してください。親に関連する複数の子レコードがあるかどう

SELECT a.* 
FROM SCHEDULE a, 
(SELECT start_date, end_date FROM SCHEDULE WHERE user_id = 123456) b 
WHERE a.user_id = 0 
AND a.start_date BETWEEN b.start_date AND b.end_date 
+0

は、リスクの重複を結合します。 –