没有子查询怎么做?

vtwuwzda  于 2021-08-01  发布在  Java
关注(0)|答案(3)|浏览(346)

SELECT COUNT(*) FROM org_type_on_related_genre 
WHERE genre_id = :deletedGenreId 
and org_type_id IN 
(SELECT org_type_id 
 FROM org_type_on_related_genre 
 GROUP BY org_type_id 
 HAVING count(*) > 1)

我需要做相同的查询,但没有子查询!
我需要得到genre\u id等于:deletedgenreid的行数,并且该表中此行的org\u type\u id值不唯一

ppcbkaq5

ppcbkaq51#

子查询没有问题。子查询实际上可以帮助提高性能,并提高代码可读性,如果您做得正确的话。它对于复杂的逻辑是必不可少的。
我们通常想要摆脱的是相关子查询,比如脚本中的子查询。以下查询实现与您的查询相同的逻辑,但没有相关的子查询:

with dup_org_type as (
select org_type_id
  from org_type_on_related_genre
 group
    by org_type_id
having count(0) > 1 
)
select count(0)
  from org_type_on_related_genre otrg
      ,dup_org_type dup
 where otrg.genre_id = :deletedgenreid
   and otrg.org_type_id = dup.org_type_id

如果表很大,有许多不同的组织类型id,并且deletedgenreid是非常有选择性的,那么您的脚本实际上会有更好的性能。这完全取决于查询需要接触的数据量。

drkbr07n

drkbr07n2#

我怀疑,如果不使用某种子查询或派生表,是否可以有效地解决这个问题。
这里有一个仍然使用子查询的选项,但是使用窗口函数。我认为这应该比原始查询更有效,因为表只扫描一次(查询的第二级更像是一个语法糖):

select count(*) 
from (
    select count(*) over(partition by org_type_id) cnt
    from org_type_on_related_genre 
    where genre_id = :deletedgenreid 
) t
where cnt > 1
fv2wmkja

fv2wmkja3#

没有子查询?我想你可以做到:

select count(*) over ()
from org_type_on_related_genre 
where genre_id = :deletedgenreid 
group by org_type_id
having count(*) > 1
limit 1;

不过,这似乎没什么用。
这是一把小提琴。

相关问题