没有子查询怎么做?

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

  1. SELECT COUNT(*) FROM org_type_on_related_genre
  2. WHERE genre_id = :deletedGenreId
  3. and org_type_id IN
  4. (SELECT org_type_id
  5. FROM org_type_on_related_genre
  6. GROUP BY org_type_id
  7. HAVING count(*) > 1)

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

ppcbkaq5

ppcbkaq51#

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

  1. with dup_org_type as (
  2. select org_type_id
  3. from org_type_on_related_genre
  4. group
  5. by org_type_id
  6. having count(0) > 1
  7. )
  8. select count(0)
  9. from org_type_on_related_genre otrg
  10. ,dup_org_type dup
  11. where otrg.genre_id = :deletedgenreid
  12. and otrg.org_type_id = dup.org_type_id

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

展开查看全部
drkbr07n

drkbr07n2#

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

  1. select count(*)
  2. from (
  3. select count(*) over(partition by org_type_id) cnt
  4. from org_type_on_related_genre
  5. where genre_id = :deletedgenreid
  6. ) t
  7. where cnt > 1
fv2wmkja

fv2wmkja3#

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

  1. select count(*) over ()
  2. from org_type_on_related_genre
  3. where genre_id = :deletedgenreid
  4. group by org_type_id
  5. having count(*) > 1
  6. limit 1;

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

相关问题