Sql 存在对派生表的使用

Sql 存在对派生表的使用,sql,sql-server,sql-server-2012,subquery,exists,Sql,Sql Server,Sql Server 2012,Subquery,Exists,试图在存在子查询中使用派生表DT,但出现错误: 无效的对象名称“DT” 派生表的作用域是否扩展到存在子查询?该作用域扩展到内部子查询,但您正在尝试克隆该表 在exists()中,您可以使用(选择ID,Name FROM…)作为DT,但最好使用和 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=

试图在存在子查询中使用派生表DT,但出现错误:

无效的对象名称“DT”


派生表的作用域是否扩展到存在子查询?

该作用域扩展到内部子查询,但您正在尝试克隆该表

exists()
中,您可以使用
(选择ID,Name FROM…)作为DT
,但最好使用

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')
建议:正如您所看到的
DT
的作用域一样,
DT.id
将起作用,问题是您试图克隆派生表,但无法克隆。在门后,这正是CTE所做的

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')

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

exists()
中,您可以使用
(选择ID,Name FROM…)作为DT
,但最好使用

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')
建议:正如您所看到的
DT
的作用域一样,
DT.id
将起作用,问题是您试图克隆派生表,但无法克隆。在门后,这正是CTE所做的

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')

您根本不需要
存在。您可以使用窗口功能:

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')

您根本不需要
存在。您可以使用窗口功能:

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')

除了CTE之外,还有其他方法可以实现这一点吗?我知道这项技术,但基于我的限制,我正在探索另一种方法。实际的派生表代码要大得多,在Exists中重用它会使代码变得庞大。您需要在
exists
中重写
DT
查询。你的极限是什么?@JuanCarlosOropeza+1 bienhecho@JuanCarlosOropeza我还有一个基于web的sql server工具,它不允许我在开始查询时使用
SELECT
。所以它不允许我以它接受的格式使用CTE。我明白了,那么你明白为什么你不能按照你的建议去做吗?您需要为
DT
检查更新复制代码。除了CTE之外,还有其他方法可以实现这一点吗?我知道这项技术,但基于我的限制,我正在探索另一种方法。实际的派生表代码要大得多,在Exists中重用它会使代码变得庞大。您需要在
exists
中重写
DT
查询。你的极限是什么?@JuanCarlosOropeza+1 bienhecho@JuanCarlosOropeza我还有一个基于web的sql server工具,它不允许我在开始查询时使用
SELECT
。所以它不允许我以它接受的格式使用CTE。我明白了,那么你明白为什么你不能按照你的建议去做吗?你需要为
DT
检查更新复制代码。像往常一样,当我只回答问题时,你会非常深入地解决问题。使用
SUM()
而不是
COUNT()
的任何原因。当你显然在计数时,我宁愿使用
COUNT()
。@JuanCarlosOropeza。首先,因为有些数据库支持诸如
sum(DT2.Name='A')
之类的结构,这是一种非常好的速记。第二,因为
count(2)
返回的值与
count(1)
的值相同,我发现这有误导性。像往常一样,当我回答问题时,你会非常深入地解决问题。使用
SUM()
而不是
COUNT()
的任何原因。当你显然在计数时,我宁愿使用
COUNT()
。@JuanCarlosOropeza。首先,因为有些数据库支持诸如
sum(DT2.Name='A')
之类的结构,这是一种非常好的速记。第二,因为
count(2)
返回的值与
count(1)
返回的值相同,我发现这有误导性。