2013年9月13日 星期五

出人意料的 PL/SQL 的 In Condition

最近有一個需求
需要用PL/SQL 查出每天最後輸入的一筆資料
在Table 內, 一天可能有多筆資料

想來想去, 大概也只能用串欄位 In (Sub-Query) 或用 Exists 的方式處理
--串欄位 In (Sub-Query)
SELECT * FROM TABLEA
WHERE (DATE_COL||TIME_COL) IN (
   SELECT DATE_COL||MAX(TIME_COL)
   FROM TABLEA
   GROUP BY DATE_COL
)

--Exists
SELECT * FROM TABLEA SRC
WHERE EXISTS (
   SELECT 1
   FROM TABLEA
   WHERE DATE_COL = SRC.DATE_COL
   GROUP BY DATE_COL
   HAVING MAX(TIME_COL) = SRC.TIME_COL
)

在前輩高手提供的解法中又學到了另一種方式
在 Oracle 10g 之後(9i 不確定有沒有)
PL/SQL 的 In Condition 有一種應用:
WHERE (expr1,expr2,...) IN (Sub-Query)
所以上例可以如此處理
--(expr1,expr2,...) In (Sub-Query)
SELECT * FROM TABLEA
WHERE (DATE_COL, TIME_COL) IN (
   SELECT DATE_COL, MAX(TIME_COL)
   FROM TABLEA
   GROUP BY DATE_COL
)

效率有沒有比較好,還不確定,但能發現自己想到的解法外的新方法,還是滿有趣的

詳細文件 :
Oracle PL/SQL In Condition

沒有留言:

張貼留言