2013-10-23 65 views
1
declare @emp table 
(
    EmployeeId int, CompanyId int ,FirstName nvarchar(50),MiddleName nvarchar(50) ,LastName nvarchar(50) 
) 

insert into @emp select 1,1,'rahul','kumar','Sharma' 
insert into @emp select 16,1,'nitin','','Sharma' 

select * From @emp 

declare @PayInformation table 
(
    EmployeeId int ,IsHourly bit ,PayFrequency nvarchar(50) ,Amount decimal(18,2),StandardHours decimal(18,2) ,Year int,Sequence int 
) 


insert into @PayInformation select 1,0,'monthly',40.00,40,2013,1 
insert into @PayInformation select 1,0,'monthly',100.00,40,2013,2 
insert into @PayInformation select 16,0,'monthly',100.00,40,2013,2 

select * From @PayInformation 

select * from @emp as e 
inner join @PayInformation as p ON e.EmployeeId=p.EmployeeId 

此連接語句給我3行加盟,因爲EmployeeId 1在PayInformation表2行。但我想只加入具有最大序列號的行。根據我所期望的結果,它應該與員工1的序列號2一起加入。只有行有最大的序列號

回答

1

有很多種方法可以做到這一點

第一:

select * 
from @emp as e 
    outer apply (
     select top 1 t.* 
     from @PayInformation as t 
     where t.EmployeeId=e.EmployeeId 
     order by t.Sequence desc 
    ) as p 

二:

select * 
from @emp as e 
    left outer join @PayInformation as p on p.EmployeeId=e.EmployeeId 
where 
    exists (
     select 1 
     from @PayInformation as t 
     where t.EmployeeId=e.EmployeeId 
     having max(t.Sequence) = p.Sequence 
    ) 

;with cte_PayInformation as (
    select *, row_number() over(partition by EmployeeId order by Sequence desc) as rn 
    from @PayInformation 
) 
select * 
from @emp as e 
    left outer join cte_PayInformation as p on p.EmployeeId = e.EmployeeId and p.rn = 1 

sql fiddle demo

只是快速的注意 - 這些查詢是不等價的,第二個可能,如果你在@PayInformation表中有重複的Sequence, EmployeeId返回更多的行。