SQL比较查询

时间:2017-06-07 13:51:48

标签: sql sql-server northwind

我正在练习查询以提高我的SQL技能(我是初学者)我遇到了这个问题,我需要帮助使用Northwind数据库。请求的查询应该:

为拥有员工的员工提供员工的姓名和所居住的城市 卖给同一个城市的顾客。

我为此写的是:

    USE Northwind;
    SELECT DISTINCT FirstName, LastName, e.City
    FROM Employees e
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID
    INNER JOIN Customers ON c.City = e.City
    WHERE e.City = ANY(SELECT Customers.City FROM Customers);

我退回了6名员工,但我不确定他们是否正确,我相信我的WHERE陈述也是错误的。

基本上我的问题是,我使用正确的连接语句,如何使用WHERE语句过滤结果?我不确定如何将一个特定记录与其他记录进行比较。来自Java背景我习惯于for循环,可以使用来自另一个“对象”的特定字段检查每个“对象”(记录)。在这种情况下,我想知道如何从Employees表中检查每个记录的City属性以及Customers表上记录的City属性。感谢任何和所有建议,谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您只需要加入客户表一次,并且具有两个要求(与员工在同一个订单和相同的城市)作为您的加入要求,例如

 SELECT DISTINCT FirstName, LastName, e.City
    FROM Employees e
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID AND c.City = e.City

或者,您可以在订单ID上加入客户,并在where子句中过滤城市要求。性能方面不应该有任何区别但是如果你要在某个时候回顾脚本它可能会帮助你记住

 SELECT DISTINCT FirstName, LastName, e.City
    FROM Employees e
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID
    WHERE e.City = C.City

我认为重要的一点是,在您加入表之后,它实际上是一个包含两列列表的表(或多个具有多个联接的列)。内部连接条件将过滤掉两个表之间不匹配的行,然后您可以比较列