如何使用EXISTS替换IN子句?

332nm8kg  于 2022-10-04  发布在  Oracle
关注(0)|答案(2)|浏览(167)
select 
    TV.ATTRIBUTE
FROM
    TABLE_VALUE TV
WHERE 
    TV.NUMBERS IN (SELECT MAX(TV1.NUMBERS) FROM TABLE_VALUE TV1 
                    WHERE TV.UNIQUE_ID=TV1.UNIQUE_ID GROUP BY UNIQUE_ID )
c3frrgcw

c3frrgcw1#

我不确定exists在这里是否有帮助,因为正如您所说的那样,每个unique_id都有许多numbers值,并且您希望为该特定unique_id选择最高numbers的属性。

exists是有用的,当你想要检查的东西是否…嗯,存在,但这里不是这样的。

h43kikqp

h43kikqp2#

您不需要EXISTS,而可以使用RANKDENSE_RANK分析函数:

SELECT attribute
FROM   (
  SELECT attribute,
         DENSE_RANK() OVER (PARTITION BY unique_id ORDER BY numbers DESC) AS rnk
  FROM   table_value
)
WHERE  rnk = 1

或者使用MAX分析函数:

SELECT attribute
FROM   (
  SELECT attribute,
         numbers,
         MAX(numbers) OVER (PARTITION BY unique_id) AS max_numbers
  FROM   table_value
)
WHERE  numbers = max_numbers;

这两个选项都只能从表中读取一次。

如果您确实想使用EXISTS(或IN),则效率会较低,因为您将查询同一个表两次,但您可以使用HAVING子句:

SELECT tv.attribute
FROM   table_value tv
WHERE  EXISTS(
  SELECT 1
  FROM   table_value tv1
  WHERE  tv1.unique_id = tv.unique_id
  HAVING MAX(tv1.numbers) = tv.numbers
)

fiddle

相关问题