将嵌套子查询转换为普通查询

时间:2013-05-09 03:55:40

标签: sql postgresql postgresql-9.1 correlated-subquery

我有以下查询问题,嵌套查询应该在哪里 转换为普通查询:

    select 
count(*) as count,
TO_CHAR(RH.updated_datetime,'DD-MM-YYYY HH:MI:SS') as date,
SUM(
   extract (
      epoch from (
         RH.updated_datetime - PRI.procedure_performed_datetime
      )
   )/60
)::integer/count(*) as diff

from 
procedure_runtime_information PRI,
study S,
report R,
report_history RH
where 

RH.report_fk = R.pk AND
R.study_fk = S.pk AND
S.procedure_runtime_fk = PRI.pk AND
RH.old_status_fk = 21 AND 
RH.revision = (select max(revision) from report_history where RH.report_fk = RH.report_fk) AND
RH.updated_datetime > TO_DATE('22-01-2013 00:00:00', 'DD-MM-YYYY HH24:MI:SS') AND RH.updated_datetime < TO_DATE('22-01-2014 00:00:00', 'DD-MM-YYYY HH24:MI:SS')

group by date order by date asc;

1 个答案:

答案 0 :(得分:2)

假设这个

(select max(revision) from report_history where RH.report_fk = RH.report_fk)

应该是:

(select max(revision) from report_history x where x.report_fk = RH.report_fk)

您可以将嵌套(相关)子查询转换为这样的普通子查询(多种方式之一):

SELECT count(*) AS ct
      ,to_char(rh.updated_datetime,'DD-MM-YYYY HH:MI:SS') AS date  -- HH24?
      ,sum(extract(epoch FROM (RH.updated_datetime
                           -  PRI.procedure_performed_datetime))
                          / 60)::int / count(*) AS diff
FROM   procedure_runtime_information PRI
JOIN   study                         S   ON S.procedure_runtime_fk = PRI.pk
JOIN   report                        R   ON R.study_fk = S.pk
JOIN   report_history                RH  ON RH.report_fk = R.pk
JOIN  (
   SELECT report_fk, max(revision) AS revision
   FROM   report_history RH1
   GROUP  BY 1
   ) RH1 ON RH1.report_fk = RH.report_fk
        AND RH1.revision = RH.revision
WHERE  RH.old_status_fk = 21
AND    RH.updated_datetime > to_date('22-01-2013', 'DD-MM-YYYY') -- >= ?
AND    RH.updated_datetime < to_date('22-01-2014', 'DD-MM-YYYY') -- to_timestamp?
GROUP  BY date  -- where does date come from?
ORDER  BY date;