删除子查询时需要SQL帮助
我有一个性能很差的SQL,它包含一个不相关的子查询。我用一个相关联的子查询替换了它,但性能变差了。有没有一种方法可以通过完全删除子查询并将其替换为联接来重写此SQL 以下是查询的简化版本:删除子查询时需要SQL帮助,sql,db2,subquery,Sql,Db2,Subquery,我有一个性能很差的SQL,它包含一个不相关的子查询。我用一个相关联的子查询替换了它,但性能变差了。有没有一种方法可以通过完全删除子查询并将其替换为联接来重写此SQL 以下是查询的简化版本: select distinct tab1.app_id, tab1.name, tab1.stat_cd, tab1.qr from apps tab1 , issues tab2 where
select distinct tab1.app_id,
tab1.name,
tab1.stat_cd,
tab1.qr
from apps tab1 , issues tab2
where
tab1.app_id = tab2.app_id and
tab1.qr = 'm' and
tab2.iqr = 'm' and
tab1.app_id not in
(
select distinct tab3.app_id
from issues tab3
where tab3.iqr = 'm' and
(
tab3.i_cd = 'f' or
tab3.i_cd = 'r' or
tab3.i_cd = 'c'
)
)
任何提示或帮助都将不胜感激。谢谢。我不确定这会有多大帮助,但我想听听它是如何做到的
SELECT DISTINCT tab1.app_id,
tab1.name,
tab1.stat_cd,
tab1.qr
FROM apps tab1
JOIN issues tab2 ON tab1.app_id = tab2.app_id
JOIN ( SELECT DISTINCT app_id AS app_id
FROM issues
WHERE iqr = 'm'
AND ( i_cd = 'f' OR
i_cd = 'r' OR
i_cd = 'c'
)
) tab3 ON tab1.app_id = tab3.app_id
WHERE tab1.qr = 'm'
AND tab2.iqr = 'm';
试试这个:-
select distinct tab1.app_id,
tab1.name,
tab1.stat_cd,
tab1.qr
from apps tab1
inner join
issues tab2
on
tab1.app_id = tab2.app_id
left join
issues tab3
on
tab1.app_id = tab3.app_id
where tab1.qr = 'm' and
tab2.iqr = 'm' and
concat(tab3.iqr,tab3.i_cd) not in ('mf','mr','mc)
希望这有帮助:-)试试这个
select distinct tab1.app_id,
tab1.name,
tab1.stat_cd,
tab1.qr
from apps tab1
inner join issues tab2 on ( tab1.app_id, tab1.qr)= ( tab2.app_id, tab2.iqr) and tab1.qr='m'
where not exists
(
select * from issues tab3
where ( tab1.app_id, tab1.qr)= ( tab3.app_id, tab3.iqr)
and tab3.i_cd in ('f', 'r', 'c')
)
其他解决方案
select distinct tab1.app_id,
tab1.name,
tab1.stat_cd,
tab1.qr
from apps tab1
inner join issues tab2 on ( tab1.app_id, tab1.qr)= ( tab2.app_id, tab2.iqr) and tab1.qr='m'
left outer join issues tab3 on ( tab1.app_id, tab1.qr)= ( tab3.app_id, tab3.iqr) and tab3.i_cd in ('f', 'r', 'c')
where tab3.app_id is null
对不起,请重读这个问题。请试试我修改过的代码。谢谢你,图尼斯。我不确定最后一个谓词(和tab1.app_id;)是什么意思。去掉它,查询返回的行比预期的少。这是我删除
不在子查询中时留下的-我也应该删除该部分。我对造成的混乱表示歉意。另外,返回更少的行是好事还是坏事?如果是后者,那么它没有返回什么?我认为WHERE
子句中的tab3.iqr='m'和
将使左连接成为内部连接
@mrtig-yup。谢谢你指出这一点。这是我的错谢谢你,印度火箭。此查询返回的行数超出预期。虽然这是一个非常有创意的解决方案,但我肯定会做一些调整:)@pdfella现在检查一下,让我知道它的工作方式子查询中的不同的是否有用!谢谢你,尤其是57号。这个也很好用。我没有足够的数据集来确定两个解决方案中哪一个更快,目前我也没有解释计划。但由于我拥有的数据集有限,您的第二个查询看起来更快。非常感谢。