试图添加注释,但是注释太长了,并且基于计数还不清楚,但是在这种情况下,子句用nvl函数代替了count语句
我需要使用rowcount修改脚本以检查表中的数据吗?在这里,我编写查询以选择从当前系统日期起最近5天的数据。但有时5天内表中没有数据。所以我需要提取10天或更长时间。
Query:
Select ep.ENTERPRISE_NAME||'|'||s.id||'|'||s.SUBMISSION_DATE||'|'||E.VALUE
from JOB_SUMMARY_EXT e, ob_summary s, enterprise ep
where e.id = s.id and e.name_res_key = 'Model'
and s.job_id in (select id from job_summary where
trunc(start_date) > trunc(sysdate) -10 and service_name ='Model2' )
我不知道如何使用rowcount修改查询。如果rowcount为0,那么我想选择10天的数据。否则它将自动获取5天。我希望将其作为单个查询来完成。
看来您要从该表中选择最近5天。那么,如果那几天的每一天都没有行,为什么要anchor到SYSDATE
?我建议另一种方法:按字面意思,选择最近5天。这是方法。
由于我没有您的表格,所以我使用的是Scott的EMP
表格,其中包含有关员工的信息。它是一个古老的列,因此HIREDATE
列设置为1980年代,但是不要紧。按HIREDATE
降序对员工进行排序显示:
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> select ename, hiredate from emp order by hiredate desc;
ENAME HIREDATE
---------- ----------
ADAMS 12.01.1983 1.
SCOTT 09.12.1982 2.
MILLER 23.01.1982 3.
FORD 03.12.1981 4.
JAMES 03.12.1981 4.
KING 17.11.1981 5. --> I want to fetch rows up to KING
MARTIN 28.09.1981
TURNER 08.09.1981
CLARK 09.06.1981
BLAKE 01.05.1981
JONES 02.04.1981
WARD 22.02.1981
ALLEN 20.02.1981
SMITH 17.12.1980
14 rows selected.
SQL>
如您所见,第4个约会是由两名员工共享的,所以我想将他们都包括在内。 DENSE_RANK
分析功能有助于:
SQL> with last5 as
2 (select ename,
3 job,
4 sal,
5 hiredate,
6 dense_rank() over (order by hiredate desc) rnk
7 from emp
8 )
9 select ename, job, sal, hiredate
10 from last5
11 where rnk <= 5;
ENAME JOB SAL HIREDATE
---------- --------- ---------- ----------
ADAMS CLERK 1100 12.01.1983
SCOTT ANALYST 3000 09.12.1982
MILLER CLERK 1300 23.01.1982
JAMES CLERK 950 03.12.1981
FORD ANALYST 3000 03.12.1981
KING PRESIDENT 5000 17.11.1981
6 rows selected.
SQL>
它做什么?LAST5
CTE对员工进行排序(如上所述),DENSE_RANK
对员工进行排名;最后,最后一个SELECT
(从第9行开始)获取所需的行。
在您的情况下,可能看起来像这样:
with last5 as
(select id,
dense_rank() over (order by start_date desc) rnk
from job_summary
where service_name = 'Model2'
)
select ep.enterprise_name,
s.id,
s.submission_date,
e.value
from job_summary_ext e
join ob_summary s on e.id = s.id
join last5 t on t.id = s.id
join enterprise ep on <you're missing join condition for this table>
where e.name_res_key = 'Model';
请注意,您缺少ENTERPRISE
表的加入条件;如果真的是这样,那么没问题-您可以在该表中使用cross join
,但是我不知何故怀疑您想要这样做。
最后,当您使用SQL * Plus时,也许您不需要连接所有列并用竖线|
符号将它们分开-将其设置为列分隔符,例如]]
SQL> set colsep '|' SQL> SQL> select deptno, dname, loc from dept; DEPTNO|DNAME |LOC ----------|--------------|------------- 10|ACCOUNTING |NEW YORK 20|RESEARCH |DALLAS 30|SALES |CHICAGO 40|OPERATIONS |BOSTON SQL>
如果您想
select count(*)
返回0,则返回最后10天,否则select count(*)
返回正数,则返回最后5天>>那么类似的事情可能会有所帮助(再次基于Scott的EMP表):
with tcnt as -- count number of rows; use your own requirement, I'm checking -- whether someone got hired today. In Scott's EMP table, nobody was -- so CNT = 0 (select count(*) cnt from emp where hiredate >= trunc(sysdate) ) select e.ename, e.job, e.sal, e.hiredate from emp e cross join tcnt c where e.hiredate >= case when c.cnt = 0 then trunc(sysdate) - 10 else trunc(sysdate) - 5 end;
将其应用于您的表;我不知道要检查这3个表的哪个
count
。
试图添加注释,但是注释太长了,并且基于计数还不清楚,但是在这种情况下,子句用nvl函数代替了count语句
SELECT ep.ENTERPRISE_NAME||'|'||s.id||'|'||s.SUBMISSION_DATE||'|'||E.VALUE
FROM JOB_SUMMARY_EXT e,
ob_summary s,
enterprise ep
WHERE e.id = s.id
AND e.name_res_key = 'Model'
AND s.job_id IN
(SELECT id
FROM job_summary
WHERE service='Model'
AND trunc(start_date) >
CASE WHEN
(WRITE your SELECT COUNT criteria WITH NVL FUNCTION)<=0 THEN
trunc(sysdate) -10
ELSE trunc(sysdate)-5
END )
试图添加注释,但是注释太长了,并且基于计数还不清楚,但是在这种情况下,子句用nvl函数代替了count语句