2010-08-16 91 views
0

为什么下面的查询在“NewAccounts”-CTE中没有名为Agentid的列时工作?T-SQL CTE问题(SQL Server 2008)

WITH 
NewAccounts AS (
    SELECT 3 as Newaccountid 
), 
MovedAUM AS (
    SELECT 1 AS Agentid, 2 as Col2 
) 
SELECT * FROM MovedAUM WHERE agentid IN (SELECT Agentid FROM NewAccounts) 

以下,修改后的查询将返回错误消息作为预期:

WITH 
NewAccounts AS (
    SELECT 3 AS newaccountid 
) 
SELECT Agentid FROM NewAccounts 

回答

1

第一个工程,因为MovedAUM是在范围嵌套SELECT内。实际上,NewAccounts中的每一行都返回MovedAUM.AgentId。换句话说,WHERE子句无所作为 - 相当于WHERE 1 = 1

此稍作修改的版本将失败:

WITH 
NewAccounts AS ( 
    SELECT 3 as Newaccountid 
), 
MovedAUM AS ( 
    SELECT 1 AS Agentid, 2 as Col2 
) 
SELECT * FROM MovedAUM WHERE agentid IN 
    (SELECT NewAccounts.Agentid FROM NewAccounts) 
0

因为你正在做明确的加盟,与

SELECT * FROM TAB1, TAB2