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首先获得并更正。这是无效的语法。我先用了它,而且是正确的。这是无效的语法。因此薪资状态在联接内部,而不是在联接外部剪切某些信息。。。哦,我真傻!非常感谢。因此,工资状态是在联接内部,而不是在联接外部剪切一些信息。。。哦,我真傻!非常感谢。这没有那么有效率