将 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;
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;