2013-06-24 70 views
2

我有一個表名是ProductDirection。它包括這些列。Oracle sql如果在選擇語句中有條件或分組依據

  1. 操作代碼
  2. messagecode
  3. productno
  4. messages_info
  5. 的StatusCode
  6. insertdate

我有一個批處理程序,該程序工作最大。一天產品3次。如果某一產品的操作成功批次,當天批次不適用於該產品。所以程序工作的同時它會成功並插入記錄失敗或成功。

我的記錄是:

ProductNo StatusCode MessagesInfo  InsertDate 
--------------------------------------------------------- 
1236895  0   Fail For xxx  01.01.2013 10:00:00 
1236895  0   Fail For yyy  01.01.2013 15:00:00 
1236895  1   Success   01.01.2013 19:00:00 
1236895  0   Fail For xxx  15.01.2013 10:00:00 
1236895  0   Fail For yyy  15.01.2013 15:00:00 
1236895  0   Fail For zzz  15.01.2013 19:00:00 

我想這個條件。如果它有可用的成功記錄,我只想在一天內獲得該記錄,並且如果所有記錄都在一天內失敗。所以我的記錄看起來像這樣。

ProductNo StatusCode MessagesInfo InsertDate 
------------------------------------------------------  
1236895  1   Success   01.01.2013 19:00:00 
1236895  0   Fail For xxx 15.01.2013 10:00:00 
1236895  0   Fail For yyy 15.01.2013 15:00:00 
1236895  0   Fail For zzz 15.01.2013 19:00:00 

我該如何解決?

SELECT * 
    FROM ProductDirection p 
WHERE p.operationcode = 6 
    AND p.messagecode = 2 
    AND trunc(p.insertdate) BETWEEN '01.01.2013' AND '21.06.2013'; 

回答

1

試試這個。

編輯:

SELECT * 
    FROM productdirection 
WHERE (productno, TRUNC (insertdate)) IN (
             SELECT productno, 
               TRUNC (insertdate) 
              FROM productdirection 
             GROUP BY productno, 
               TRUNC (insertdate) 
              HAVING MAX (statuscode) = 0) 
    OR statuscode = 1; 

sqlfiddle here

添加任何其他地方的必備條款。

+0

謝謝你的回答,並抱歉我遲到的迴應。我有索引productdirection table.Index包括insertdate,...(來自where條件列)。這個查詢的成本是非常昂貴的trunc(insertdate)。我怎樣才能減少這個查詢?你能提供任何解決方案嗎? – engcmreng

+0

@engcmreng,更新了答案和sqlfiddle。這應該會降低查詢的成本。 – Noel

+0

感謝您的幫助。 – engcmreng

0
WITH ProductDirection AS 
(
SELECT 1236895 ProductNo, 0 StatusCode, 'Fail For xxx' MessagesInfo, TO_DATE('01.01.2013 10:00:00', 'DD.MM.YYYY HH24:MI:SS') InsertDate FROM DUAL UNION ALL 
SELECT 1236895, 0, 'Fail For yyy', TO_DATE('01.01.2013 15:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL 
SELECT 1236895, 1, 'Success',  TO_DATE('01.01.2013 19:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL 
SELECT 1236895, 0, 'Fail For xxx', TO_DATE('15.01.2013 10:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL 
SELECT 1236895, 0, 'Fail For yyy', TO_DATE('15.01.2013 15:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL UNION ALL 
SELECT 1236895, 0, 'Fail For zzz', TO_DATE('15.01.2013 19:00:00', 'DD.MM.YYYY HH24:MI:SS') FROM DUAL 
) 
SELECT * 
    FROM ProductDirection 
    WHERE insertdate >= (
          SELECT MAX(InsertDate) 
          FROM ProductDirection 
          WHERE MessagesInfo = 'Success' 
          AND  InsertDate >= TO_DATE('01.01.2013', 'DD.MM.YYYY') 
         ) 
    ORDER BY insertdate; 
/* 
1236895 1 Success   2013-01-01 19:00:00 
1236895 0 Fail For xxx 2013-01-15 10:00:00 
1236895 0 Fail For yyy 2013-01-15 15:00:00 
1236895 0 Fail For zzz 2013-01-15 19:00:00 
*/