Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MS SQL:嵌套选择-神秘;无效的列名";错误_Sql Server_Sql Server 2000 - Fatal编程技术网

Sql server MS SQL:嵌套选择-神秘;无效的列名";错误

Sql server MS SQL:嵌套选择-神秘;无效的列名";错误,sql-server,sql-server-2000,Sql Server,Sql Server 2000,当我对MSSQL 2000运行以下查询时 SELECT DISTINCT(Email), (SELECT TOP 1 ActivityID FROM Activity aa, ActivityType tt WHERE aa.ActivityTypeId = tt.ActivityTypeId AND aa.ConsumerID = c.ConsumerID AND tt.ActivityTyp

当我对MSSQL 2000运行以下查询时

SELECT 
    DISTINCT(Email),
    (SELECT TOP 1 ActivityID
        FROM Activity aa, ActivityType tt 
        WHERE aa.ActivityTypeId = tt.ActivityTypeId 
            AND aa.ConsumerID = c.ConsumerID
            AND tt.ActivityType = 'Something_OptIn') optin,
    (SELECT TOP 1 ActivityID
        FROM Activity aa, ActivityType tt 
        WHERE aa.ActivityTypeId = tt.ActivityTypeId 
            AND aa.ConsumerID = c.ConsumerID
            AND tt.ActivityType = 'Something_OptOut') optout
FROM
    Activity a,
    Consumer c,
    ActivityType t
WHERE
    c.CountryID = '23'
    AND t.ActivityType = 'Something_Create'
    AND a.ActivityTypeId = t.ActivityTypeId
    AND c.ConsumerID = a.ConsumerID
    AND optin > 1
我得到以下错误

Server: Msg 207, Level 16, State 3, Line 1
Invalid column name 'optin'.

为什么会发生这种情况?我不明白为什么它会无效。

SQL Server不允许您在同一级别按名称引用别名。要解决此问题,请重复列定义:

WHERE
    c.CountryID = '23'
    AND t.ActivityType = 'Something_Create'
    AND a.ActivityTypeId = t.ActivityTypeId
    AND c.ConsumerID = a.ConsumerID
    AND (SELECT TOP 1 ActivityID
        FROM Activity aa, ActivityType tt 
        WHERE aa.ActivityTypeId = tt.ActivityTypeId 
            AND aa.ConsumerID = c.ConsumerID
            AND tt.ActivityType = 'Something_OptIn'
        ) > 1
或使用子查询:

SELECT  *
FROM    (
        SELECT 
            DISTINCT(Email),
            (...) optin,
            (...) optout
        FROM
            Activity a,
            Consumer c,
            ActivityType t
        ) as SubqueryAlias
WHERE
    c.CountryID = '23'
    AND t.ActivityType = 'Something_Create'
    AND a.ActivityTypeId = t.ActivityTypeId
    AND c.ConsumerID = a.ConsumerID
    AND optin > 1

最后一行
和optin>1
是罪犯

WHERE
子句对SELECT列表中的列别名一无所知

您可能应该子查询此SELECT而不使用有问题的条件,并将该条件应用于外部SELECT

SELECT *
FROM (
  SELECT
  ...
  WHERE ... /* everything except 'optin > 1' */
) anyAlias
WHERE optin > 1

它只适用于一个嵌套的SELECT,但不适用于optin和optout。请参阅。@jwandborg:您链接到的查询包含
=NULL
,但任何内容都不等于NULL。即使
null=null
也不是真的。您可能正在查找
为null