3

我的基表结构如下所示:

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 被定义为存储过程中的输出变量):

SELECT ID, MAX(GREATEST(CREATE_DATE, UPDATE_DATE) as LAST_MODIFIED
FROM EXAMPLE_TABLE
RETURNING ID INTO pID;

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

PS这是在Oracle11g中。我目前正在使用 MERGE 将行更新插入表中,并使用此方法获取最后一个更新行的 id。如果您对此有任何建设性的批评(可能有替代解决方案),我会全力以赴。我已经阅读了很多关于为什么这是好/坏的论点。我将在 c# 中调用此过程,因此感谢您提供任何其他提示。

4

2 回答 2

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

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

于 2013-06-05T23:19:03.873 回答
1

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

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
于 2013-06-05T23:16:54.917 回答