我需要一些关于左连接条件的帮助,我的查询如下
declare @emp table (id int, name varchar(100))
insert into @emp values (1,'Emp1')
insert into @emp values (2,'Emp2')
insert into @emp values (3,'Emp3')
insert into @emp values (4,'Emp4')
insert into @emp values (5,'Emp5')
--selecT * from @emp
declare @salary table(salaryid int, empid int, salary decimal(10,2))
insert into @Salary values (3,3,10000)
insert into @Salary values (4,4,15000)
insert into @Salary values (3,5,10000)
declare @oldsalary table(oldsalaryid int, empid int, oldsalary decimal(10,2))
insert into @oldsalary values (1,1,20000)
insert into @oldsalary values (2,2,25000)
--select * from @Salary
--select * from @oldsalary
declare @rating table (salaryid int, rating varchar(10))
insert into @rating values (4, 'D')
insert into @rating values (3, 'C')
insert into @rating values (1, 'B')
insert into @rating values (2, 'A')
--select * from @rating
select e.id, e.name, isnull(os.oldsalary, s.salary) salary, r.rating from @emp e
left join @salary s on e.id=s.empid
left join @oldsalary os on e.id=os.empid
left join @Rating r on r.salaryid = isnull(os.oldsalaryid, s.salaryid)
这是输出
id name salary rating
1 Emp1 20000 B
2 Emp2 25000 A
3 Emp3 10000 C
4 Emp4 15000 D
5 Emp5 10000 C
从查询中可以看出,如果oldsalaryid为null,则salaryid用于加入评级表。所以左连接完全基于列的值。这是正确的方法,通过查看数据似乎正确显示。我可以使用此查询吗?
答案 0 :(得分:0)
您实际上告诉SQL Server要做的是从@emp表中返回所有值。然后,@ amplary表中与@emp表匹配的所有项都被拉入。之后,来自@oldsalary表中与@emp表上的值匹配的所有值都被拉入。并且与@Rating表。
我更喜欢采用这种只使用左连接而不是左连接和右连接组合的方法。它使阅读代码的人能够非常清楚地了解comblex连接中的主要表格是什么。因此,您不需要向后和向前阅读语句的FROM部分。