Sql 如何重构此查询
如何重写此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
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。如果这不是你实际拥有的,请编辑你的问题以修正陈述。