Sql 为什么子查询中的分组会导致问题

Sql 为什么子查询中的分组会导致问题,sql,sap-ase,Sql,Sap Ase,当我在下面的子查询中包含2个注释掉的行时,我的Sybase 12.5 ASE服务器似乎要花很长时间才能得到任何结果。如果没有这两行,查询运行正常。这种分组有什么问题 select days_played.day_played, count(distinct days_played.user_id) as OLD_users from days_played inner join days_received on days_played.day_played = days_received.day

当我在下面的子查询中包含2个注释掉的行时,我的Sybase 12.5 ASE服务器似乎要花很长时间才能得到任何结果。如果没有这两行,查询运行正常。这种分组有什么问题

select days_played.day_played, count(distinct days_played.user_id) as OLD_users
from days_played inner join days_received
on days_played.day_played = days_received.day_received
and days_played.user_id = days_received.user_id
where days_received.min_bulk_MT > days_played.min_MO
and days_played.user_id in

(select sgia.user_id 
from days_played as sgia
where sgia.day_played < days_played.day_played
--group by sgia.user_id 
--having sum(sgia.B_first_msg) = 0
)

group by days_played.day_played

使用showplan显示解释,了解查询的作用


在这种情况下,您不能通过将子查询作为主查询的一部分来消除它吗?

您可以尝试按如下方式重写查询吗

select days_played.day_played,
       count(distinct days_played.user_id) as OLD_users
  from days_played
 inner join days_received on days_played.day_played = days_received.day_received
                         and days_played.user_id = days_received.user_id
 where days_received.min_bulk_MT > days_played.min_MO
   and 0 = (select sum(sgia.B_first_msg)
              from days_played as sgia
             where sgia.user_id = days_played.user_id
               and sgia.day_played < days_played.day_played
            )
 group by days_played.day_played

我想这会给你带来更好的性能…

好的,我发现了问题所在 我必须在子查询中包含用户id:where days\u play.user\u id=sgia.user\u id 而sgia.day_played关键是在这种情况下,使用exists比使用in要好,因为此时必须使用索引。