【发布时间】:2021-10-06 17:11:55
【问题描述】:
在下面示例的输出中,我希望看到 ControlNo = 2222 的单行。
但为什么它仍然给我带来 2 行?
测试数据
IF OBJECT_ID('tempdb..#pol') IS NOT NULL DROP TABLE #pol;
select 1111 as ControlNo, 'Policy1' as PolicyNumber, 'Cancelled' as CurrStatus, 0 as Premium
into #pol
union
select 2222 as ControlNo, 'Policy1' as PolicyNumber, 'Bound' as CurrStatus, 100 as Premium
--select * from #pol
select *
from #pol a
where PolicyNumber = 'Policy1'
-- here I want to filter only ControlNo 2222
and exists(
SELECT FIRST_VALUE(ControlNo) OVER (PARTITION BY PolicyNumber ORDER BY ControlNo DESC)
FROM #pol p
WHERE p.ControlNo = a.ControlNo
)
输出:
ControlNo PolicyNumber CurrStatus Premium
1111 Policy1 Cancelled 0
2222 Policy1 Bound 100
如果我只运行 FIRST_VALUE 语句,那么它会按预期工作。给我最后一个ControlNo,也就是2222。
SELECT FIRST_VALUE(ControlNo) OVER (PARTITION BY PolicyNumber ORDER BY ControlNo DESC)
FROM #pol p
(No column name)
2222
2222
但如果我将此语句放在 EXISTS 子句中,那么它会给我带来ControlNo's
【问题讨论】:
-
EXISTS中的FIRST_VALUE毫无意义,因为重要的是是否在EXISTS中返回了任何行。
标签: sql sql-server tsql exists