在 IF EXISTS 查询中使用 CTE

Wes*_*key 8 sql-server cte

是否可以在 SQL Server 2012 中执行类似于以下操作?

IF EXISTS (
    WITH DATA AS (
        SELECT *, 
        ROW_NUMBER() OVER(PARTITION BY column ORDER BY Column) AS rn
        FROM table )
    SELECT *
    FROM DATA
    WHERE rn = 2 )
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)

我尝试使用此语法并收到错误消息。如果这是不可能的,使用临时表是实现此目的的最佳方法吗?

Aar*_*and 10

CTE 不能用作子查询。一种解决方法是:

IF EXISTS 
(
  SELECT 1 FROM 
  (
    SELECT ROW_NUMBER() OVER(PARTITION BY column ORDER BY Column) AS rn
    FROM table
  ) AS DATA 
  WHERE rn = 2
)
BEGIN
  ...
END
Run Code Online (Sandbox Code Playgroud)

另一个是:

IF EXISTS (SELECT 1 FROM dbo.table GROUP BY column HAVING COUNT(*) > 1)
BEGIN
  ...
END
Run Code Online (Sandbox Code Playgroud)

即使你提出的语法是有效的,该EXISTS会在这种情况下,不短路,无论如何,我认为(我怀疑这就是为什么你会想使用它),因为之前的窗口函数必须兑现了全套rn能被过滤。