我有一个sql问题。我在图像中有3个表格。在前端(用户界面),我有一个selectone框来选择课程和员工自动完成。自动填充必须检索所有员工姓名以及所选课程的状态。
我试过
select e.id,per.id,t.status
from employee e
join person per on e.personId=per.id
left join training t on e.id=t.employeeId`
但是这会检索employeeId' 1'的重复行。 对于id为1的员工,我只需要使用所选的courseId(从用户界面中选择)退出行。
简而言之,我需要所有员工的信息以及所选择的课程员工信息,并且也不能重复这些信息。
如果选择的课程ID为34,则检索的输出必须包含
Empid,PersonName,Status
1, Ravi , 1;
2, Meera , 0;
3, Rahul ,0;
4, Vinu, 0.
如何构建reqd sql查询?
根据提供的建议,我将接受的答案修改为(根据我的要求)
SELECT e.id,per.name,COALESCE(t.status,0)
FROM employee e
JOIN person per ON e.personId=per.id
LEFT JOIN training t ON e.id=t.employeeId
AND t.courseId = ?
答案 0 :(得分:5)
左连接的技巧是将左连接表上的条件添加到 join 条件:
select e.id,per.id,t.status
from employee e
join person per on e.personId=per.id
left join training t on e.id=t.employeeId
and t.courseId = ?
这只会尝试加入特定的训练行。
如果将课程条件放入 where 子句中,则会丢失左连接 - 它实际上变为内连接,因为在连接之后执行where子句条件是。然而,连接条件中的条件在连接时执行。
作为一般性评论,很多人都没有意识到你可以将非关键条件纳入连接条件。事实上,正如在这种情况下,它是获得所需输出的最简洁方法。