Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何重构此查询_Sql_Oracle_Refactoring - Fatal编程技术网

Sql 如何重构此查询

Sql 如何重构此查询,sql,oracle,refactoring,Sql,Oracle,Refactoring,如何重写此SQL代码?我希望避免重复执行每个记录的案例 SELECT chcr.chsid, CASE WHEN EXISTS (SELECT 1 FROM hdr_run chre, clmerr ce WHERE chre.chsid = chcr.chsid AND chre.run_nmbr < chcr.last_run_nmbr AND chre.clm_error_sid = ce.clm_error_sid GROUP

如何重写此SQL代码?我希望避免重复执行每个记录的案例

SELECT chcr.chsid,
CASE
WHEN EXISTS
  (SELECT 1
  FROM hdr_run chre,
    clmerr ce
  WHERE chre.chsid       = chcr.chsid
  AND chre.run_nmbr      < chcr.last_run_nmbr
  AND chre.clm_error_sid = ce.clm_error_sid
  GROUP BY chre.chsid
  HAVING COUNT(chre.clm_error_sid) > 0
  )
THEN 'Appended'
ELSE 'Never Appended'
END Run_Detail
FROM 
clm_res chcr,
clm_der chde
WHERE chde.chsid          = chcr.chsid

请查看该查询:

SELECT 
    chcr.chsid,
    CASE
        WHEN ce.clm_error_sid IS NOT NULL AND COUNT(chre.clm_error_sid, 0) > 0
            THEN 'Appended'
            ELSE 'Never Appended'
    END Run_Detail
FROM 
    clm_res chcr
        JOIN clm_der chde ON chde.chsid = chcr.chsid
        LEFT JOIN hdr_run chre ON chre.chsid = chcr.chsid AND chre.run_nmbr < chcr.last_run_nmbr
        LEFT JOIN clmerr ce ON chre.clm_error_sid = ce.clm_error_sid
GROUP BY chcr.chsid

如果基于chsid的每个clm请求有多个clm请求,我们必须再次检查计数是否不包括clm_der中的额外项。

我没有数据来测试这一点,所以我只能继续使用您提供的SQL,但从简单的外观来看,似乎不需要GROUP BY和HAVING COUNT>0语句作为子查询中内部连接条件的组合以及存在于外部查询中,则执行相同的操作

这是否具有完全相同的功能:

SELECT  chcr.chsid,
        CASE
        WHEN EXISTS
        ( SELECT 1
          FROM   hdr_run chre
                 INNER JOIN
                 clmerr ce
                 ON (chre.clm_error_sid = ce.clm_error_sid)
          WHERE  chre.chsid    = chcr.chsid
          AND    chre.run_nmbr < chcr.last_run_nmbr
        )
        THEN 'Appended'
        ELSE 'Never Appended'
        END Run_Detail
FROM    clm_res chcr
        INNER JOIN
        clm_der chde
        ON ( chde.chsid = chcr.chsid );

此外,重复执行CASE语句也不是坏事,因为优化器不应该重复执行子查询。

您的语句似乎无效。你有一个目标,但没有目标。我已经修改了语句,使其具有WHERE,并删除了and。如果这不是你实际拥有的,请编辑你的问题以修正陈述。