不等于运算符不会返回正确的结果sql

时间:2013-01-23 17:55:31

标签: sql compare equals

我在那里有这个查询我希望得到所有在2月12日没有处理订单的人员 2008年

Select Distinct E.empid, lastname, firstname 
    From HR.Employees as E
    INNER JOIN Sales.Orders as O
    ON E.empid = O.empid 
    Where O.orderdate <> Convert(datetime,'02/12/2008',101)

使用NOT IN,EXISTS或set运算符不适用有人可以给我一个真正的解决方案和解释

4 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用左外连接:

Select Distinct E.empid, lastname, firstname 
From HR.Employees as E left outer join
     Sales.Orders as O
     ON E.empid = O.empid and O.orderdate = Convert(datetime,'02/12/2008',101)
where o.orderdate is NULL

如果员工和订单之间存在匹配日期,则where子句会忽略这些记录。

此查询正在重述您的逻辑。在2008年2月12日,你说“我想得到所有没有处理订单的人”。这种方式的工作原理是它实际上将员工与该日期的订单进行匹配。但是,因为它使用left outer join,所以当没有匹配时匹配会留下NULL。这些是你想要的。

从某种意义上说,这个查询回答了同等的问题,措辞为“我希望所有的权利都不能在这样的日期与订单匹配。”

答案 1 :(得分:0)

Select E.empid, lastname, firstname 
    From HR.Employees as E
WHERE NOT EXISTS (SELECT O.Empid FROM Sales.Orders as O
    WHERE O.empid = E.EmpID
    AND O.orderdate = '02/12/2008')

编辑:假设订单表中没有没有处理它的员工的指定日期的记录。

Select E.empid, lastname, firstname, MAX(O.OrderDate) 
    From HR.Employees as E LEFT JOIN Sales.Orders as O
    ON O.empid = E.EmpID
    WHERE O.orderdate = '02/12/2008'
GROUP BY E.empid, lastname, firstname
HAVING MAX(O.OrderDate) IS NULL
编辑2:我没试过这个。我希望您能够了解使用LEFT JOINMAXHAVING完成的工作。

答案 2 :(得分:0)

在进行日期比较时,您应该使用trunc。 试试这个

Select Distinct E.empid, lastname, firstname 
    From HR.Employees as E
    INNER JOIN Sales.Orders as O
    ON E.empid = O.empid 
    Where trunc(O.orderdate) <> trunc(TO_DATE('02/12/2008','MM/DD/YYYY'))

答案 3 :(得分:0)

对于Sql-Server:

我认为问题出在date format上。请尝试使用ISO格式(yyyymmdd)。此外,由于您没有时间在右侧,因此o.orderdate should be a date type field会将其转换为convert(date,O.orderdate) <> Convert(date,'20081202');

Select Distinct E.empid, lastname, firstname 
From HR.Employees as E
INNER JOIN Sales.Orders as O
ON E.empid = O.empid 
Where convert(date,O.orderdate) <> Convert(date,'20081202')