2016-03-18 7 views
0

私はこれを数日間続けてきました。Oracle PL/SQL:異なる条件の複数のレコードがテーブル内に存在するかどうか

私はPL/SQL(および一般的なSQL)をかなり使い慣れており、複数の条件が列に存在するかどうかを判断しようとしていますが、単一のレコード(WHERE文が調べるもの)ではありません。

たとえば、私は従業員のテーブルと予定されている作業シフトがあるとしましょう。そして、私はまた、以下のように残業をするためのテーブルを持っているとしましょう。(すべての期間について申し訳ありません、あきらめる前にテーブルをフォーマットする方法を理解するために1時間を費やしました):

テーブル "ScheduledShifts 「

EmployeeID ShiftID ShiftDate 
1   1   3/20/16 
1   3   3/21/16  
1   1   3/22/16 
2   1   3/20/16 
2   1   3/21/16 
2   2   3/22/16 

表 『OvertimeBids』

EmployeeID ShiftID ShiftDate 
1   4   3/21/16 
2   4   3/21/16 

私はテーブルの下にリストされたルールに従って、以下の結果と第三のテーブルに移入されたやりたい:

表「結果」

EmployeeID ShiftID ShiftDate ApprovedYN 
1   4   3/21/16  N 
2   4   3/21/16  Y 

ルール: 特定の従業員は、特定の日にシフト4に入札された場合...
、彼らが作業しているシフト1その入札日
、彼らの前日作業シフト3は、入札日
の日ですし、その入札期日

が続いて結果テーブルにエントリを追加し、「N」

と「ApprovedYN」を移入後、彼らは一日のシフト1を作業しています

これ以外の場合は、結果テーブルにエントリを追加し、「Y」を「ApprovedYN」に設定します。

ANDおよびORは、各フィルタを適用するのではなく、すべてのフィルタを各レコードに適用するためテーブルに個別に

ありがとうございます!

+2

(1)サンプルデータ、所望の結果にあなたの質問を編集します。 (2)「一般的な考え方」は、誰かが質問を終わらせるための招待状である(広すぎる?意見に基づいたもの)。特定の問題を決定し、それを記述します。それから誰かがあなたを助けることができます。 –

+0

申し訳ありませんが、これは初めて投稿したものですが、まだフォーマットする方法を学びたいと思っています。私はそれをきれいにするよ – Rymius

答えて

0

試してみてください。

select employeeID,ShiftID,ShiftDate, 
     CASE WHEN EXISTS( 
       select * 
       from ScheduledShifts ss1 
       join ScheduledShifts ss2 on ss1.EmployeeID = ss2.EmployeeID 
       join ScheduledShifts ss3 on ss2.EmployeeID = ss3.EmployeeID 
       where 
        ss1.EmployeeID = ob.EmployeeID 
        /* AND they are working shift 1 the day BEFORE that bid date */ 
        AND ss1.ShiftID = 1 AND ss1.shiftdate = ob.shiftdate - 1 
        /* AND they are working shift 3 the day OF that bid date */ 
        AND ss2.ShiftID = 3 AND ss2.shiftdate = ob.shiftdate 
        /* AND they are working shift 1 the day AFTER that bid date */ 
        AND ss3.ShiftID = 1 AND ss3.shiftdate = ob.shiftdate + 1 
      ) 
      /* Then add an entry to the results table 
       and populate "ApprovedYN" with an "N" */ 
      THEN 'N' 
      /* Otherwise, add an entry to the results table 
       and populate "ApprovedYN" with a "Y" */ 
      ELSE 'Y' 
     END As ApprovedYN 
from OvertimeBids ob;