使用OR语句需要更长时间的Oracle SQL查询

时间:2016-05-03 21:00:57

标签: sql oracle

我有一个不花时间的查询:

select count(*) from mytable where processed_status = 0 and tid not in 
  (select max(tid) from mytable group by userid)

tid是一个自动递增的唯一标识符。我从mytable中获取了不是基于userid的最新行的所有行。这些是重复的行,我放弃它们。现在我添加另一个过滤器来获取特定行以及上述查询中的所有行。我运行以下查询,它在我杀死之前运行了10分钟。

select count(*) from mytable where processed_status = 0 and (tid = 5 or tid not in 
  (select max(tid) from mytable group by userid))

如果有更好的方法来获取所有重复的行,我也会对一些想法感兴趣。

1 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER()分析函数:

SELECT COUNT(*)
FROM   (
  SELECT tid,
         ROW_NUMBER() OVER ( PARTITION BY userid ORDER BY tid DESC ) AS rn
  FROM   mytable
  WHERE  processed_status = 0
)
WHERE  tid = 5
OR     rn > 1