SQL连接两个表

时间:2011-03-09 18:43:50

标签: sql tsql join auto-populating

我有2个表员工(id和名字)和工资(id,工资),第1行有4行,第2行有2行。

table 1            Table 2
id   Name         id    salary
1     Sue          1    10000 
2    Sarah         3     9000
3    Nick 
4    james 

我希望加入如下

id   Name     Salary
1     Sue     10000
2    Sarah    No Salary
3    Nick     9000
4    james    No salary

4 个答案:

答案 0 :(得分:7)

要在加入缺少第2行和第4行的表T1时从T2获取所有行,您需要使用left outer join。对于第2行和第4行,工资将为空。

要使用其他内容替换空值,您可以使用coalesce。 Coalesce返回第一个非空参数。

由于字段salary被声明为int字段,并且您想要No Salary作为输出而没有薪水,您需要cast int来在使用它作为coalesce中的参数之前的varchar

declare @T1 table(id int, name varchar(10))
declare @T2 table(id int, salary int)

insert into @T1 values(1, 'Sue')
insert into @T1 values(2, 'Sarah')
insert into @T1 values(3, 'Nick')
insert into @T1 values(4, 'james') 

insert into @T2 values(1, 10000)
insert into @T2 values(3, 9000)

select
  T1.id,
  T1.name,
  coalesce(cast(T2.salary as varchar(10)), 'No Salary') as salary 
from @T1 as T1
  left outer join @T2 as T2
    on T1.id = T2.id  

结果

id          name       salary
----------- ---------- ----------
1           Sue        10000
2           Sarah      No Salary
3           Nick       9000
4           james      No Salary

答案 1 :(得分:2)

SELECT e.id, e.name , 
case
when s.salary is null then 'no salary'
else cast(s.salary as varchar)
end
FROM employees e LEFT JOIN salary s
ON e.id=s.id
order by e.id

答案 2 :(得分:0)

您的目标是列出所有员工,无论他们是否有列出的薪水,因此您应该使用LEFT JOIN。内部联接可能会列出员工表中不再有列表的员工的工资,而隐式联接(我相信)会丢失行。

这样的事情应该做你需要的事情:

SELECT E.id, E.name, S.salary FROM Employees E LEFT JOIN Salary S ON E.id = S.id

答案 3 :(得分:-2)

这应该可以解决问题。

SELECT e.id, e.name , s.salary FROM employees e 
INNER JOIN salary s
ON e.id=s.id
ORDER BY e.id ASC

编辑:

如果工资数据为空变量,请尝试LEFT JOIN