当我针对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'.
为什么会这样?我不明白为什么它会无效。
答案 0 :(得分:5)
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
答案 1 :(得分:1)
最后一行AND optin > 1
是罪犯。
WHERE
子句对SELECT列表中的列别名一无所知。
您应该在没有违规条件的情况下对此SELECT进行子查询,并将该条件应用于外部SELECT。
SELECT *
FROM (
SELECT
...
WHERE ... /* everything except 'optin > 1' */
) anyAlias
WHERE optin > 1