Sql 不确定在查询中使用什么:Left Join-internal Join-Where子句

Sql 不确定在查询中使用什么:Left Join-internal Join-Where子句,sql,join,Sql,Join,比如说,我有两张表,员工表和工资表: employee salary |---------|---------| |--------|----------|----------| | ID | Name | | E_ID | Amount | Status | |-------------------| |------------------------------| | 1 | Matt | | 1

比如说,我有两张表,员工表和工资表:

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
但那会把大卫排除在外

我试着左转

...
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'
这又把大卫排除在外了

我不知道怎么继续


谢谢您的帮助。

您应该使用on条款中的salary.status条件
LEFT JOIN salary 
  ON employee.ID = salary.E_ID
 AND salary.status = 'Current'
如果你让这个条件作为一个内部连接,而不为所有员工返回valye

select employee.name, salary.amount
from employee
LEFT JOIN salary ON employee.ID=salary.E_ID AND salary.status='Current'

您应该使用on子句中的salary.status条件 如果你让这个条件作为一个内部连接,而不为所有员工返回valye

select employee.name, salary.amount
from employee
LEFT JOIN salary ON employee.ID=salary.E_ID AND salary.status='Current'

狗仔队给出的答案是我也会这么做,但纯粹为了获取信息,另一种方式是这样的:

...
employee
LEFT JOIN salary ON employee.ID=salary.E_ID
WHERE isnull(salary.status, 'Current')='Current'
最后一个例子是你再次忽视了大卫;如果使用WHERE isnullsalary.status,'Current'='Current'替换如下:

...
employee
LEFT JOIN salary ON employee.ID=salary.E_ID
WHERE isnull(salary.status, 'Current')='Current'

然后,这将仍然包括他,正如我们所说的,尽管左连接没有返回任何内容,但无论如何都要将空值视为“当前”,并匹配其中的where子句。

狗仔队给出的答案也是我这样做的方式,但纯粹为了提供信息,另一种方式是这样做的:

...
employee
LEFT JOIN salary ON employee.ID=salary.E_ID
WHERE isnull(salary.status, 'Current')='Current'
最后一个例子是你再次忽视了大卫;如果使用WHERE isnullsalary.status,'Current'='Current'替换如下:

...
employee
LEFT JOIN salary ON employee.ID=salary.E_ID
WHERE isnull(salary.status, 'Current')='Current'

然后,这将仍然包括他,正如我们所说的,尽管左连接没有返回任何内容,但仍将null视为“当前”,并匹配此上的where子句。

将此添加到where子句:或salary.status为null将其添加到where子句:或salary.status为NULLI首先获得并更正。这是无效的语法。我先用了它,而且是正确的。这是无效的语法。因此薪资状态在联接内部,而不是在联接外部剪切某些信息。。。哦,我真傻!非常感谢。因此,工资状态是在联接内部,而不是在联接外部剪切一些信息。。。哦,我真傻!非常感谢。这没有那么有效率