如何使用EXISTS替换IN子句


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 )

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

exists在您想检查某个东西是否。。。嗯,存在,但这里不是这样。

您不需要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
)

小提琴

最新更新