对于同一个员工id,员工表有多个员工名称。需要从名称表中识别正确的名称,并单独显示匹配的行。如果姓名表中没有员工id,则显示多个员工姓名
空表
id name status
1 David 0
1 James 1
2 Kelvin 0
2 John 1
Name table
id Name
1 James
预期输出
Id Name status
1 James 1
2 Kelvin 0
2 John 1
如果我加入内线,那么我将只获得比赛记录。当emp id在employee和name中都可用时,只显示匹配的记录,当empid在empleyee表中不在name表中时,显示所有行。
内部加入员工表上的名称表
例如:
SELECT n.firstname, n.lastname FROM employee AS e INNER JOIN [name] AS n ON e.employee_id = n.employee_id
一个选项是联合两个集合:一个用于匹配行,一个用于不匹配行。
(最初,有Oracle标记,所以我使用在Oracle上工作的CTE表单中的样本数据;无论如何,你都不会键入那段代码,所以忽略它(:
样本数据:
SQL> with
2 emp (id, name, status) as
3 (select 1, 'David' , 0 from dual union all
4 select 1, 'James' , 1 from dual union all
5 select 2, 'Kelvin', 0 from dual union all
6 select 2, 'John' , 1 from dual
7 ),
8 name (id, name) as
9 (select 1, 'James' from dual)
10 --
查询从这里开始:
11 -- matching rows (James)
12 select e.id, e.name, e.status
13 from emp e join name n on n.id = e.id and n.name = e.name
14 union all
15 -- non-matching rows (Kelvin and John)
16 select e.id, e.name, e.status
17 from emp e
18 where not exists (select null
19 from name b
20 where b.id = e.id
21 )
22 order by id;
ID NAME STATUS
---------- ------ ----------
1 James 1
2 Kelvin 0
2 John 1
SQL>