Вопрос T-SQL CTE (SQL Server 2008) - PullRequest
       21

Вопрос T-SQL CTE (SQL Server 2008)

0 голосов
/ 16 августа 2010

Почему работает следующий запрос, если в «NewAccounts» -CTE нет столбца с именем Agentid?

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

Ответы [ 3 ]

1 голос
/ 16 августа 2010

Первый работает, потому что 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 голосов
/ 16 августа 2010

SQL Server знает, он имеет столбцы 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

0 голосов
/ 16 августа 2010

Поскольку вы делаете явное соединение с

SELECT * FROM TAB1, TAB2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...