不确定在查询中使用什么:左连接 - 内连接 - Where子句

时间:2018-01-15 16:15:23

标签: sql join

我说,我有两张桌子,员工和薪水:

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'

让大卫再次离开。

不确定如何继续。

感谢您的帮助。

3 个答案:

答案 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'