2013-11-19 3 views
0

у меня есть следующий SQL:ошибка «Неверное имя столбца» SQL, с внутренним выберите

SELECT A.*, 
(SELECT answer FROM [tblAnswers] B 
WHERE B.memberID = A.memberID AND QuestionID = 3) AS ethnicity 
FROM [tblMembers] A 
WHERE 
LOWER(gender) = 'm' 
AND ethnicity = 'Sephardi' 

и я получаю ошибку Invalid column name 'ethnicity' со ссылкой на последней ссылки на эту колонку.

Вопрос: Почему эта колонка недоступна для предложения WHERE?

Я знаю, что если я делаю следующее, это работает:

SELECT A.*, 
(SELECT answer FROM [tblAnswers] B WHERE B.memberID = A.memberID AND QuestionID = 3) AS ethnicity 
FROM [tblMembers] A 
WHERE 
LOWER(gender) = 'm' 
AND convert(nvarchar, (SELECT answer FROM [tblAnswers] B WHERE B.memberID = A.memberID AND QuestionID = 3)) = 'Sephardi' 
+2

Вы не можете, это ограничение SQL-сервера: http://stackoverflow.com/questions/16161938/how-to-use -alias-column-name-in-where-clause-in-sqlserver –

+0

вы можете использовать cte –

+0

Я вижу небольшую причину _not_, чтобы использовать простое соединение. Это также решит вашу проблему. – oerkelens

ответ

2

Вы не можете использовать имя столбца, вы только назначенный в пункте SELECT в следующей статье WHERE. В общем случае вы можете поместить его в подзапрос, а затем использовать имя столбца:

SELECT * FROM 
(
    SELECT A.*, 
    (SELECT answer FROM [tblAnswers] B 
    WHERE B.memberID = A.memberID AND QuestionID = 3) AS ethnicity 
    FROM [tblMembers] A 
    WHERE LOWER(gender) = 'm' 
) s 
WHERE ethnicity = 'Sephardi' 

Этот запрос может быть лучше подходит для JOIN хотя:

SELECT A.*, t.answer AS ethnicity 
FROM [tblMembers] A 
LEFT JOIN tblAnswers t ON b.memberID = A.memberID AND QuestionID = 3 
WHERE LOWER(gender) = 'm' AND t.answer = 'Sephardi' 
+0

спасибо. мне понадобится 'LEFT JOIN', поскольку эти вторичные строки могут не существовать. У меня есть 3 из этих полей подзапроса для фильтрации. какой метод лучше по отношению к ресурсам? – kneidels

+0

Лично я использую 'JOIN' 100% времени - я уверен, что есть случаи, когда подзапрос может быть лучше, но я еще не встречал его на практике. – OGHaza

3

Вы не можете использовать «вычисляемые» столбцы в вашем предложении where, не ссылаясь конкретно на все вычисления (запрос, случай и т. д.).

Вы должны присоединиться к таблице запроса вместо subquerying его:

Select A.*, B.answer 
From tblMembers A 
    Inner Join tblAnswers B on A.memberID = B.membeID and A.QuestionID = 3 
Where Lower(gender) = 'm' 
    and B.answer = 'Sephardi' 
+0

Почему 'LEFT JOIN' вместо' INNER JOIN'? –

+0

Привычка действительно, никакой другой причины. В равной степени это может быть и в этом случае. Я обновил выбор, чтобы быть внутренним, учитывая конкретный сценарий. –

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