这是基于列值离开加入表的正确方法吗?

时间:2012-09-05 11:39:50

标签: sql-server left-join

我需要一些关于左连接条件的帮助,我的查询如下

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用于加入评级表。所以左连接完全基于列的值。这是正确的方法,通过查看数据似乎正确显示。我可以使用此查询吗?

1 个答案:

答案 0 :(得分:0)

您实际上告诉SQL Server要做的是从@emp表中返回所有值。然后,@ amplary表中与@emp表匹配的所有项都被拉入。之后,来自@oldsalary表中与@emp表上的值匹配的所有值都被拉入。并且与@Rating表。

我更喜欢采用这种只使用左连接而不是左连接和右连接组合的方法。它使阅读代码的人能够非常清楚地了解comblex连接中的主要表格是什么。因此,您不需要向后和向前阅读语句的FROM部分。