我说,我有两张桌子,员工和薪水:
employee salary
|---------|---------| |--------|----------|----------|
| ID | Name | | E_ID | Amount | Status |
|-------------------| |------------------------------|
| 1 | Matt | | 1 | 100 | Past |
| 2 | John | | 1 | 120 | Current |
| 3 | David | | 2 | 150 | Current |
|---------|---------| |--------|----------|----------|
我需要他们之间的联接,这将返回我的员工薪资信息:如果它不在薪水表中,则返回null,如果重复,则只返回一个值(标记为“当前”与“过去”相对的值)
在这个例子中,我要求的回报是:
|---------|---------------|---------------|
| ID | Name | Amount |
|---------|---------------|---------------|
| 1 | Matt | 120 |
| 2 | John | 150 |
| 3 | David | NULL |
|---------|---------------|---------------|
我最初尝试使用
WHERE employee.ID=salary.E_ID
但这会让大卫离开。
我尝试了LEFT JOIN
...
employee
LEFT JOIN salary ON employee.ID=salary.E_ID
但是这显示了Matt两次,如果我添加了where子句
...
employee
LEFT JOIN salary ON employee.ID=salary.E_ID
WHERE salary.status='Current'
让大卫再次离开。
不确定如何继续。
感谢您的帮助。
答案 0 :(得分:4)
LEFT JOIN salary
ON employee.ID = salary.E_ID
AND salary.status = 'Current'
答案 1 :(得分:2)
Paparazzi给出的答案也是我这样做的方式,但纯粹是为了获取信息,另一种方法就是这样:
对于你最后再次忽略大卫的例子;如果您使用WHERE isnull(salary.status, 'Current') ='Current'
而不是这样:
...
employee
LEFT JOIN salary ON employee.ID=salary.E_ID
WHERE isnull(salary.status, 'Current')='Current'
然后,正如我们所说,这仍将包括他,虽然左连接没有带回任何东西,但无论如何都将null视为'current',并匹配where子句。
答案 2 :(得分:1)
您应该在on子句中使用salary.status的条件 如果你把这个条件作为一个内部联接,并且不为所有员工返回valye
select employee.name, salary.amount
from employee
LEFT JOIN salary ON employee.ID=salary.E_ID AND salary.status='Current'