2010-08-16 6 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) 

다음은 수정 된 쿼리는 예상대로 오류 메시지를 반환합니다 MovedAUM가 중첩 된 SELECT 내 범위에 있기 때문에

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

답변

1

첫 번째 작품. 실제로는 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 
0

SQL과 그에 참여, 그것은 그러나, Agentid 열이 그것을 사용할 수 있습니다 원하는 것을 사용하지 마십시오. IN을 사용하지 마십시오. 이것을 사용하면 이것을 방지합니다.

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

여기에 또한보십시오 : http://sqlservercode.blogspot.com/2007/04/you-should-never-use-in-in-sql-to-join.html