SQL Oracle SQL条件连接

新二号

我正在研究资产管理系统的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章