我有一个问题。我有一个查询将作为夜间工作的一部分运行。此查询应该为我提供当天发生的所有操作。然而,这是棘手的部分,它不会总是在同一时间运行。
因为它是夜间工作的一部分,所以可能发生在第1天,查询在00:05运行,在第2天,它在23:55运行。这使查询变得复杂,因为我不能说使用今天的日期或使用昨天的日期。
到目前为止,我得到了以下查询:
select deuda_id from deuda where n_expediente in
(select
(case when to_char(sysdate, 'HH24:MI:SS') between '00:00:00' and '12:00:00' then
(select n_expediente from cartas_enviadas where codigo_carta in ('OIEUR','OIGBP') and f_envio > trunc(sysdate-1)
) else
(select n_expediente from cartas_enviar where codigo_carta in ('OIEUR','OIGBP')
)
) from dual
);
一点解释:(数据库是西班牙语/意大利语): deuda_id是唯一的发票号。 n_expediente是案例编号(对于此客户端始终是唯一的)。 f_envio是执行日期。 codigo_carta是动作类型。
Cartas_enviar保留所有到期的行动。执行操作时,将输入f_envio。一夜之间,所有已执行的操作都将从cartas_enviar移至cartas_enviadas。)
Wat我想做的是以下内容:
我想看看当前的时间。如果是在午夜之前,我想查看表cartas_enviar,并从那里获取n_expediente,但前提是该操作是OIEUR或OIGBP。如果它是在午夜之后,我想查看表cartas_enviadas,并从那里获取n_expediente,但前提是该操作是OIEUR或OIGBP,并且该操作是否已于昨天执行。
但是,当我尝试执行此查询时,我收到以下错误消息:
ORA-00905: missing keyword
。
有人可以帮我解决一下这个问题吗?
PS:这是一个Oracle数据库
答案 0 :(得分:0)
问题是你不能从子查询的子查询中提取许多这样的值来传回它们。请尝试这种方法:
select deuda_id
from deuda
where
(to_char(sysdate, 'HH24:MI:SS') between '00:00:00' and '12:00:00'
AND n_expediente IN (select n_expediente
from cartas_enviadas
where codigo_carta in ('OIEUR','OIGBP')
and f_envio > trunc(sysdate-1) ))
OR (NOT to_char(sysdate, 'HH24:MI:SS') between '00:00:00' and '12:00:00'
AND n_expediente IN (select n_expediente
from cartas_enviar
where codigo_carta in ('OIEUR','OIGBP')))
;