我正在研究资产管理系统的Oracle SQL查询。我的查询使用AMS设备表中的信息更新数据仓库。不幸的是,AMS有点垃圾,“设备”表中没有上次修改日期,也没有任何方法可以使用审核来获取日期。
设备表有2,000,000条记录,所以我不想在办公时间内更新整个记录。相反,我想将其限制为链接到最近更新的工单的设备。但是我还需要整夜更新整个表,以获取未附加在工作单上的任何新记录。我想避免有两次导入,所以我不会遇到其中一种导入被更改而另一种没有更改的情况。
我所追求的是一种基于一天中的时间可以添加额外联接的方法。
因此在办公时间内:
SELECT
*
FROM
Equipment
INNER JOIN
( SELECT DISTINCT Equipment_ID FROM Work_Orders
WHERE Work_Orders.Last_Update > SYSDATE - 2
) WO
ON
Equipment.Equipment_ID = WO.Equipment_ID
但是说了晚上9点之后
SELECT
*
FROM
Equipment
我在其他地方看到过使用条件为ON的联接的示例,但是,即使在有联接为条件的条件下,也没有发现。这有可能吗?
我对这个问题的看法。我在WHERE子句中使用AND和EXISTS构造对OR语句进行惰性计算。这样,所有条件都是WHERE子句的一部分。
样本数据
create table Equipment
(
Id varchar(3)
);
insert into Equipment values ( 'E01' );
insert into Equipment values ( 'E02' );
create table Orders
(
Num varchar(5),
LastModified date,
EquipmentId varchar(3)
);
insert into Orders values ( 'OR001', SYSTIMESTAMP-4, 'E01' );
insert into Orders values ( 'OR002', SYSTIMESTAMP-3, 'E02' );
insert into Orders values ( 'OR003', SYSTIMESTAMP, 'E01' );
insert into Orders values ( 'OR004', SYSTIMESTAMP, 'E01' );
获取所有适用的设备ID。在晚上9点之前,OR条件的第一部分失败,然后评估下一部分。晚上9点之后,OR条件的第一部分有效(由于懒惰的评估,下一部分不再有效)。
实际解决方案
select distinct Id
from Equipment
where extract(HOUR from SYSTIMESTAMP) > 21 -- after 9pm do not evaluate the next part of OR condition
or exists ( select 'x'
from Orders
where EquipmentId = Id
and LASTMODIFIED > SYSDATE-2 );
[ SQL小提琴]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句