2010-08-16 4 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. Он фактически возвращает MovedAUM.AgentId для каждой строки в NewAccounts. Другими словами, статья 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, используйте EXISTS, это предотвратит это.

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

Смежные вопросы