2016-03-03 117 views
0

我有以下关系:使用外部连接的SQL查询?

enter image description here

,我想列出加入该公司的2014年6月之前,但在2014年6月使用某种外连接没有收到佣金的所有员工。我想出了这个查询,但它不起作用。有人可以告诉我如何查询这个?

SELECT DISTINCT Employee.EmpId, Employee.EmpName 
FROM Employee 
LEFT OUTER JOIN Commission 
ON Employee.EmpId = Commission.EmpId 
WHERE Employee.JoinDate BETWEEN Employee.JoinDate AND '2014-06-31' 
GROUP BY Employee.EmpId, Employee.EmpName 
HAVING COUNT(Commission.Commdate BETWEEN '2014-06-01' AND '2014-06-31') = 0 
ORDER BY Employee.EmpId 

回答

1

LEFT JOIN是一个好主意。但是,您需要ON条款中的佣金日期。然后找到不匹配的员工。所以,这里是一个版本的查询(清理使用表的别名):

SELECT e.EmpId, e.EmpName 
FROM Employee e LEFT OUTER JOIN 
    Commission c 
    ON e.EmpId = c.EmpId AND 
     c.Commdate BETWEEN '2014-06-01' AND '2014-06-31' 
WHERE e.JoinDate < '2014-06-01' AND c.EmpID IS NULL 
GROUP BY e.EmpId, e.EmpName 
ORDER BY e.EmpId; 

也许更自然的方式来编写查询,虽然是:

SELECT e.* 
FROM employee e 
WHERE NOT EXISTS (SELECT 1 
        FROM Commission c 
        WHERE e.EmpId = c.EmpId AND 
         c.Commdate BETWEEN '2014-06-01' AND '2014-06-31' 
       ) AND 
     e.JoinDate < '2014-06-01'; 
+0

谢谢你,这使得它真的很清楚。 –