将 EXISTS 与派生 table 结合使用

Use EXISTS with derived table

SELECT *
FROM 
( SELECT ID, Name
  FROM ....
) AS DT
WHERE NOT EXISTS (SELECT 1 FROM DT AS DT2 WHERE DT.ID=DT2.ID AND DT2.Name='A')

尝试在存在子查询中使用派生的 table DT 但出现错误:

Invalid object name 'DT'

派生的范围是否 table 不扩展到存在子查询?

范围扩展到内部子查询,但您正在尝试克隆 table。

exists () 中你可以使用 ( SELECT ID, Name FROM .... ) AS DT 但最好使用 WITH

WITH cte as ( 
       SELECT ID, Name
       FROM ....
) 
SELECT *
FROM cte as DT
WHERE NOT EXISTS (SELECT 1 
                  FROM cte AS DT2 
                  WHERE DT.ID=DT2.ID 
                    AND DT2.Name='A')

建议:如您所见,DT 的范围与 DT.id 一样有效,问题是您尝试克隆派生的 table 而你不能。在门后,这正是 CTE 所做的。

SELECT *
FROM ( SELECT ID, Name
       FROM ....) as DT
WHERE NOT EXISTS (SELECT 1 
                  FROM ( SELECT ID, Name
                         FROM ....) AS DT2 
                  WHERE DT.ID=DT2.ID 
                    AND DT2.Name='A')

您根本不需要 exists。您可以使用 window 函数:

SELECT ID, Name
FROM (SELECT ID, Name,
             SUM(CASE WHEN DT2.Name = 'A' THEN 1 ELSE 0 END) OVER (PARTITION BY ID) as a_cnt
      FROM ....
     ) DT
WHERE a_cnt = 0;