SQL:在嵌套查询中使用 AND 语句

问题描述

我正在学习在线教程系列,现在我们正在研究嵌套查询。尝试玩弄并思考我可以玩这个概念的方法我想尝试进行组合嵌套查询,但我不确定如何和谷歌没有给我带来太多运气。再一次,这样的事情很难说出来。我正在使用 MS sql

SELECT EmployeeID,FirstName,LastName
FROM sqlTutorial.dbo.EmployeeDemographics 

WHERE EmployeeID
IN (SELECT EmployeeID
FROM sqlTutorial.dbo.EmployeeSalary
WHERE JobTitle = 'DBA')

/*
AND 

WHERE EmployeeID 
IN (SELECT EmployeeID
FROM sqlTutorial.dbo.WareHouseEmployeeDemographics
WHERE Age = 29)
*/

这就是我认为我能做到的。从示例中我知道未注释的部分有效。如果 ID 在 EDemo 和 ESalary 中并且他们的职位是 DBA,它会从 EDemo 获取 ID、名字和姓氏。

好吧,我想进一步限制这些结果,只让结果是那些也在仓库工作并且是 29 岁的人。

我的意思是,如果我在没有未注释的情况下运行带注释的代码,它也会按预期工作,但我不确定为什么我不能将两者结合起来。我 90% 确定它是 b/c 我不能像这样使用 AND 语句,我有一种偷偷摸摸的感觉,我必须将两者嵌套在一起并在嵌套中嵌套。

它就像是塔可钟里的塔可里的塔可,肯德基在你梦想中的购物中心里!对不起,我忍不住了。

解决方法

只需删除第二秒“Where”,您的查询就可以很好地执行。您只需要一个 where 子句,您就可以在其中将所有条件与 and 等组合起来。

SELECT EmployeeID,FirstName,LastName
FROM SQLTutorial.dbo.EmployeeDemographics 

WHERE EmployeeID
IN (SELECT EmployeeID
FROM SQLTutorial.dbo.EmployeeSalary
WHERE JobTitle = 'DBA')

AND EmployeeID 
IN (SELECT EmployeeID
FROM SQLTutorial.dbo.WareHouseEmployeeDemographics
WHERE Age = 29)

如果您想要 ID 在 EDemo 和 ESalary 中且职位为 DBA 但在仓库工作且年满 29 岁的所有员工。

 SELECT EmployeeID,LastName
    FROM SQLTutorial.dbo.EmployeeDemographics 
    
    WHERE EmployeeID
    IN (SELECT EmployeeID
    FROM SQLTutorial.dbo.EmployeeSalary
    WHERE JobTitle = 'DBA')
    
    or EmployeeID 
    IN (SELECT EmployeeID
    FROM SQLTutorial.dbo.WareHouseEmployeeDemographics
    WHERE Age = 29)
,

正如评论中所指出的,问题在于有两个 WHERE。只需要第一个 WHERE;指定 WHERE 后,条件可以使用 AND、OR 之类的东西连接起来。取消注释并删除第二个 WHERE 应该可以修复它。所以,不要写“WHERE a=b AND WHERE c=d”,而是写“WHERE a=b AND c=d”。