SQL';无效的列名';错误,使用内部选择

SQL';无效的列名';错误,使用内部选择,sql,sql-server,Sql,Sql Server,我有以下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' 我得到一个错误无效的列名“种族”引用了对该列的最后一次引用 问题:为什么WHERE子句不能使用此列

我有以下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' 
我得到一个错误
无效的列名“种族”
引用了对该列的最后一次引用

问题:为什么
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'  

您不能使用刚刚在以下
WHERE
子句的
SELECT
子句中指定的列名。一般情况下,您可以将其放入子查询中,然后使用列名:

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' 
此查询可能更适合于
联接
,不过:

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' 

您不能使用刚刚在以下
WHERE
子句的
SELECT
子句中指定的列名。一般情况下,您可以将其放入子查询中,然后使用列名:

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' 
此查询可能更适合于
联接
,不过:

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' 
在where子句中使用“Computed”列时,必须特别引用整个计算(查询、大小写等)

您应该联接查询表,而不是对其进行子查询:

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'
在where子句中使用“Computed”列时,必须特别引用整个计算(查询、大小写等)

您应该联接查询表,而不是对其进行子查询:

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'

不能,这是sql server的一个限制:实际上,我认为没有什么理由不使用简单的连接。它还可以解决您的问题。您不能,这是sql server的一个限制:实际上,我认为没有什么理由不使用简单的连接。这也会解决你的问题。为什么
左连接
而不是
内部连接
?习惯真的,没有其他原因。在这种情况下,两者都是一样的。我已经更新了特定场景下的选择为内部。为什么
左连接
而不是
内部连接
?真的,没有其他原因。在这种情况下,两者都是一样的。我已经根据具体场景将选择更新为内部。谢谢。我需要
左连接
,因为这些辅助行可能不存在。我有三个子查询字段要过滤。哪种方法在资源方面更好?就我个人而言,我100%的时间都在使用
JOIN
100%——我确信有些情况下子查询可能更好,但我在实践中还没有遇到过。谢谢。我需要
左连接
,因为这些辅助行可能不存在。我有三个子查询字段要过滤。哪种方法在资源方面更好?就我个人而言,我100%的时间都在使用
JOIN
100%——我确信在某些情况下子查询可能更好,但我在实践中还没有遇到过。