首页 > 解决方案 > 以下查询是什么意思?

问题描述

请参考以下用 oracle 编写的查询。谁能告诉我查询的含义?

select count(*) from dual connect by level <= 5
group by trunc(next_day(trunc(sysdate,'mm')-1, 'sunday') + (level -1)*7,'mm')

标签: sqloracleoracle11g

解决方案


如果您检查哪个 group by 子句的部分返回,它是当月的第一天,计算结果为随后的第一个星期日:

SQL> select trunc(sysdate, 'mm') trnc,
  2         next_day(trunc(sysdate, 'mm') - 1, 'sunday') ne_day
  3  from dual;

TRNC       NE_DAY
---------- ----------
01.04.2021 04.04.2021
           ^
           first Sunday in April 2021

connect by子句返回 5 行。哪个?当查询选择dual其中只有一列 ( dummy) 的值为'X'时,您不会看到太多。但是,如果您检查group by子句中的内容并选择这些值,您会得到

SQL> select trunc(next_day(trunc(sysdate,'mm')-1, 'sunday') + (level -1)*7,'mm')
  2  from dual
  3  connect by level <= 5;

TRUNC(NEXT
----------
01.04.2021        --> 4 rows of 1st of April 2021
01.04.2021
01.04.2021
01.04.2021
01.05.2021        --> 1 row  of 5th of April 2021

SQL>

当您计算每个值的出现次数(由于该group by子句)时,您发布的查询的最终结果是

SQL> select count(*)
  2  from dual
  3  connect by level <= 5
  4  group by trunc(next_day(trunc(sysdate,'mm')-1, 'sunday') + (level -1)*7,'mm');

  COUNT(*)
----------
         1        --> that's for 5th of April 2021
         4        --> that's for 1st of April 2021

SQL>

推荐阅读