我在那里有这个查询我希望得到所有在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运算符不适用有人可以给我一个真正的解决方案和解释
答案 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 JOIN
,MAX
和HAVING
完成的工作。
答案 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')