Oracle SQL:选择具有多列之间最新日期的单行

时间:2013-06-05 23:06:39

标签: c# sql oracle stored-procedures

我的基表结构如下所示:

CREATE TABLE EXAMPLE_TABLE
{
   ID NUMBER NOT NULL,
    - 这里的其他栏目,
   CREATE_USER VARCHAR2(255 BYTE)NOT NULL,
   CREATE_DATE DATE DEFAULT SYSDATE NOT NULL,
   UPDATE_USER VARCHAR2(255 BYTE),
   UPDATE_DATE DATE
}

我想要做的是选择update_date或create_date最高的行的id。所以这样的事情(尽管这不起作用 - 在存储过程中将pID定义为out变量):

SELECT ID,MAX(GREATEST(CREATE_DATE,UPDATE_DATE)为LAST_MODIFIED
来自EXAMPLE_TABLE
将ID返回到pID;

这将返回一个基本上是表中修改的最后一行的id。帮助不大?

P.S。这是在Oracle11g中。我目前正在使用MERGE将行插入表中,并使用此方法获取最后一个upserted行的id。如果你对此有任何建设性的批评(可能有另一种解决方案),我会全力以赴。我已经阅读了很多关于为什么这是好/坏的论点。我将在c#中调用此过程,所以其他任何提示都值得赞赏。

2 个答案:

答案 0 :(得分:3)

我认为你想要的结构是:

select id
from (SELECT ID
      FROM EXAMPLE_TABLE
      order by GREATEST(CREATE_DATE, UPDATE_DATE) desc
     )
where rownum = 1

但是,我想其中一个日期可能为NULL。如果是这样的话:

select id
from (SELECT ID
      FROM EXAMPLE_TABLE
      order by coalesce(GREATEST(CREATE_DATE, UPDATE_DATE), CREATE_DATE) desc
     )
where rownum = 1

这些查询按每行上两个值中较大的一个排序,然后选择最大值。

答案 1 :(得分:1)

使用所有日期字段创建所有ID的合成,然后使用rownum restirction将它们最大化以仅获取第一个。

WITH A AS (
    SELECT ID, Max(FirstDateField) AS value
    FROM TableName
                WHERE ROWNUM=1
                GROUP BY ID
                ORDER BY Max(FirstDateField) DESC
    UNION ALL
    SELECT ID, Max(SecondDateField) AS value
    FROM TableName
                WHERE ROWNUM=1
                GROUP BY ID
                ORDER BY Max(SecondDateField) DESC
)
SELECT ID 
FROM A
WHERE ROWNUM=1
ORDER BY Value DESC