2010-08-16 5 views
0

Pourquoi la requête suivante fonctionne-t-elle, lorsqu'il n'y a pas de colonne nommée Agentid dans "NewAccounts" -CTE?Question CTE T-SQL (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) 

qui suit, retourne requête modifié le message d'erreur comme prévu:

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

Répondre

1

Le premier fonctionne parce que MovedAUM est portée dans le SELECT imbriquée. Il renvoie en réalité MovedAUM.AgentId pour chaque ligne dans NewAccounts. En d'autres termes, la clause WHERE ne fait rien - c'est équivalent à WHERE 1 = 1.

Cette version légèrement modifiée échouera:

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

Parce que vous faites jointure explicite en ce que,

SELECT * FROM TAB1, TAB2 
0

SQL Server sait, il a les colonnes agentid et peut l'utiliser, mais il est pas ce que vous voulez, ne pas utiliser, l'emploi EXISTE il empêchera cette

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) 

Voir aussi ici: http://sqlservercode.blogspot.com/2007/04/you-should-never-use-in-in-sql-to-join.html