0

我有这个查询,我想得到所有在 2008 年 2 月 12 日没有处理订单的 empids

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 或集合运算符不适用,有人能给我一个真正的解决方案和解释吗

4

4 回答 4

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 日没有处理订单的 empids”。它的工作方式是它实际上将员工与该日期的订单相匹配。但是,因为它使用 a left outer join,所以匹配项在没有匹配项时会留下 NULL。这些是您想要的。

从某种意义上说,这个查询回答了等价的问题,表述为“我想要所有在某某日期未能匹配订单的 empids”。

于 2013-01-23T18:32:20.960 回答
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')

编辑:假设 Orders 表不会有给定日期的员工谁没有处理它的记录。

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

EDIT2:我没有试过这个。我希望您了解使用LEFT JOIN,MAXHAVING.

于 2013-01-23T18:03:32.000 回答
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'))
于 2013-01-23T18:05:05.977 回答
0

对于 Sql 服务器:

我认为问题出在你的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')
于 2013-01-23T18:08:55.823 回答