我有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
答案 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