C# Oracle SQL:在多个列之间选择具有最新日期的单行
我的基表结构如下所示: 创建表格示例\u表格 { ID号不为空, -这里的其他专栏, 创建用户VARCHAR2255字节非空, 创建\u日期默认系统日期不为空, 更新用户VARCHAR2255字节, 更新日期 } 我要做的是选择更新日期或创建日期最高的行的id。因此,类似这样的情况虽然不起作用-pID在存储过程中定义为out变量: 选择ID、MAXGREATESTCREATE\u DATE、UPDATE\u DATE作为上次修改的日期 从示例_表 将ID返回pID; 这将返回表中修改的最后一行的单个id。帮个小忙C# Oracle SQL:在多个列之间选择具有最新日期的单行,c#,sql,oracle,stored-procedures,C#,Sql,Oracle,Stored Procedures,我的基表结构如下所示: 创建表格示例\u表格 { ID号不为空, -这里的其他专栏, 创建用户VARCHAR2255字节非空, 创建\u日期默认系统日期不为空, 更新用户VARCHAR2255字节, 更新日期 } 我要做的是选择更新日期或创建日期最高的行的id。因此,类似这样的情况虽然不起作用-pID在存储过程中定义为out变量: 选择ID、MAXGREATESTCREATE\u DATE、UPDATE\u DATE作为上次修改的日期 从示例_表 将ID返回pID; 这将返回表中修改的最后一行的
另外,这是Oracle11g中的。我目前正在使用MERGE将行向上插入到表中,并使用此方法获取最后一个向上插入行的id。如果你对此有任何建设性的批评,或者有其他解决方案,我洗耳恭听。我读过很多关于为什么这是好的/坏的争论。我将在c中调用这个过程,因此任何其他提示都值得赞赏。创建一个包含所有日期字段的所有ID的组合,然后使用rownum restriction将其最大化,以仅获取第一个ID
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
我认为你想要的结构是:
select id
from (SELECT ID
FROM EXAMPLE_TABLE
order by GREATEST(CREATE_DATE, UPDATE_DATE) desc
)
where rownum = 1
但是,我认为其中一个日期可能为空。如果是:
select id
from (SELECT ID
FROM EXAMPLE_TABLE
order by coalesce(GREATEST(CREATE_DATE, UPDATE_DATE), CREATE_DATE) desc
)
where rownum = 1
这些查询按每行两个值中的较大值排序,然后选择最大值。是的,这就是我要找的。我想知道Oracle是否有比选择有序列表的第一行更快的方法。不过,这会起作用:@craignewkirk。如果性能是一个问题,请提出另一个问题。参考这篇文章,提供更多关于数据大小的信息。嗨,达伦,感谢你的回答。您知道在大型数据集上哪个更快:您的还是Gordon的?我主要使用SQL Server,但如果它确实以类似的方式响应,那么我刚才所做的修改应该会使执行速度更快,将WHERE ROWNUM=1添加到每个分组的顶级查询中。为日期字段编制索引对于创建此查询实例(无论大小)至关重要。明白了-感谢您的更新。我还没有足够的声誉去投票,但一旦我投票了,我会投票给大家,以获得反馈。