Sql 查询以将3个不同的数据列与参考值进行比较
我需要检查表(在Oracle数据库中)是否包含在某个日期之后更新的条目。在这种情况下,“更新”是指3列(Sql 查询以将3个不同的数据列与参考值进行比较,sql,oracle,Sql,Oracle,我需要检查表(在Oracle数据库中)是否包含在某个日期之后更新的条目。在这种情况下,“更新”是指3列(DateCreated,DateModified,DateDeleted)中的任何一列的值大于参考值。 到目前为止,我提出的问题是 select * from myTable where DateCreated > :reference_date or DateModified > :reference_date or DateDeleted > :refer
DateCreated
,DateModified
,DateDeleted
)中的任何一列的值大于参考值。
到目前为止,我提出的问题是
select * from myTable
where DateCreated > :reference_date
or DateModified > :reference_date
or DateDeleted > :reference_date
;
这可以工作并提供所需的结果,但不是我想要的,因为我只想输入一次:reference_date
的值。
关于如何编写更优雅的查询,您有什么想法吗?我想您可以将其改写为:
select * from myTable
where greatest(DateCreated, DateModified, DateDeleted) > :reference_date;
如果你一定要,但我不会。您的原始查询,IMHO,比这个查询更容易理解,另外,通过使用函数,您已经失去了使用索引的机会,如果索引存在的话(除非您有一个基于新子句的基于函数的索引)。而您所拥有的看起来很好,并且只使用了一个bind变量,如果出于某种原因,您有位置绑定而不是命名绑定,则可以通过使用内联视图或CTE避免多次提供绑定值:
with cte as (select :reference_date as reference_date from dual)
select myTable.*
from cte
join myTable
on myTable.DateCreated > cte.reference_date
or myTable.DateModified > cte.reference_date
or myTable.DateDeleted > cte.reference_date
;
但是,除非你有一个非常有说服力的理由和一个提供绑定值的问题,否则我不会考虑比原来更好。例如,对我来说,从一个调用程序中设置三次可能算不上有吸引力。在部署之前,我会检查它是否影响性能—我希望Oracle能够优化类似的内容,但执行计划可能会很有趣。但这只是一次。您有一个名为reference_date的绑定变量,在查询中使用了三次。使用Oracle,如果您描述了输入(或类似内容),在这种情况下,您会得到count=1还是3?我同意;这是一个解决方案,但最好使用原始查询。和:当任何值为NULL时,最大值返回NULL。所以你必须把它和COALESCE结合起来,这使得它更复杂,可读性也更低。这一点很好!尽管我会在每个列周围使用NVL(它比coalesce短!)。ETA:事实上,要使nvl的默认值与条件匹配或不匹配(取决于要求),我无论如何都要将其与:reference_日期绑定(例如nvl(datecreated,:reference_date-1)),这将有点否定使用best的全部意义!您可以使用
magest(NVL(DateCreated,DATE'0001-01-01')、NVL(DateModified,DATE'0001-01-01')、NVL(DateDeleted,DATE'0001-01-01'))
甚至magest(COALESCE(DateCreated,DateModified,DateDeleted)、COALESCE(DateDeleted,DateCreated,DateModified),COALESCE(DateModified,DateDeleted,DateCreated))
,这正是我要找的。我比较了执行计划,您的解决方案成本为5(而我的为4)。轻微的性能下降并没有问题,这将导致调用程序中的代码更加干净(实际上我必须使用位置参数)。