2017-01-03 2 views
0

Я написал инструкцию запроса соединения. этот оператор возвращает мне многократную (повторяющуюся) строку, даже если у меня есть только одна запись.Дублирующие записи с несколькими объединениями

declare @BenefitClass int ; 

set @BenefitClass = (select BenefitClass From HJOB where userid='d76c5000-69e0-461e-92e1-3cfe7590d098' and CompanyId =1629) 
select @BenefitClass; 
select 
bve.EmployerContribution, 
bhsac.CatchUpValue as CatchUpValue , 
bcl.Tier, 
bcl.planYear, 
bhsac.Ischecked, 
isnull(bhsac.Value,0) as EmployeeContribute, 
Id=(convert(varchar, bcl.Id) + '$' + convert(varchar, isnull(bhsac.Id, 0))) , 
bhsac.Value , 
bhsac.HSALmitId 
from  
dbo.benContributionStructure bcs 
inner join dbo.benVariableElection bve on bcs.PlanInfoId = bve.PlanInfoId 
inner join dbo.benBenefitContributionLimit bcl on bcs.SavingCategory =  bcl.CategoryID 
left outer join dbo.benBenefitHSACoverage bhsac on bcs.PlanInfoId = bhsac.planInfoId 
     and bcl.Id=bhsac.HSALmitId --and [email protected] 
     and bhsac.UserID='d76c5000-69e0-461e-92e1-3cfe7590d098' and bhsac.PlanInfoId=38044 
left outer join dbo.benEmployeeContribution bec on bhsac.UserID = bec.UserId and bhsac.BenefitClassId = bec.BenefitClassId -- and bec.EnrollmentType !='Closed' 
left outer join benOpenEnrollment oems on oems.ID = bec.OpenEnrollmentId and oems.EndDt > GETDATE()    
where  
bcs.PlanInfoId=38044 and bcl.Ischecked=1 
         and bcl.Tier !='CatchUp'  
    and bcl.CompanyId=1629 

Для этого я получаю результат, как второй ряд, как дубликат:

observe the result

ответ

1

Попробуйте один раз он может Помощь

declare @BenefitClass int ; 

set @BenefitClass = (select BenefitClass From HJOB where userid='d76c5000-69e0-461e-92e1-3cfe7590d098' and CompanyId =1629) 
select @BenefitClass; 

;with cte as (
select 
bve.EmployerContribution, 
bhsac.CatchUpValue as CatchUpValue , 
bcl.Tier, 
bcl.planYear, 
bhsac.Ischecked, 
isnull(bhsac.Value,0) as EmployeeContribute, 
Id=(convert(varchar, bcl.Id) + '$' + convert(varchar, isnull(bhsac.Id, 0))) , 
bhsac.Value , 
bhsac.HSALmitId 
from  
dbo.benContributionStructure bcs 
inner join dbo.benVariableElection bve on bcs.PlanInfoId = bve.PlanInfoId 
inner join dbo.benBenefitContributionLimit bcl on bcs.SavingCategory =  bcl.CategoryID 
left outer join dbo.benBenefitHSACoverage bhsac on bcs.PlanInfoId = bhsac.planInfoId 
     and bcl.Id=bhsac.HSALmitId --and [email protected] 
     and bhsac.UserID='d76c5000-69e0-461e-92e1-3cfe7590d098' and bhsac.PlanInfoId=38044 
left outer join dbo.benEmployeeContribution bec on bhsac.UserID = bec.UserId and bhsac.BenefitClassId = bec.BenefitClassId -- and bec.EnrollmentType !='Closed' 
left outer join benOpenEnrollment oems on oems.ID = bec.OpenEnrollmentId and oems.EndDt > GETDATE()    
where  
bcs.PlanInfoId=38044 and bcl.Ischecked=1 
         and bcl.Tier !='CatchUp'  
    and bcl.CompanyId=1629 
    ) 
    select distinct EmployerContribution, 
CatchUpValue ,Tier,planYear,Ischecked,EmployeeContribute,Id ,Value ,HSALmitId from cte 
+0

Могу ли я узнать, почему вы пошли с CTE? –

+0

Ничего отличного трюка .. я просто использовал ** Distinct ** для данных, которые извлекались из CTE. –

+0

Да, я понял о разных, которые дали мне точный ожидаемый результат. Но я был спутан с CTE. Я начинаю работать с сервером sql. Я делал то же самое без получения от CTE. –

0

Пожалуйста, измените условия, где, как показано ниже:

select 
bve.EmployerContribution, 
bhsac.CatchUpValue as CatchUpValue , 
bcl.Tier, 
bcl.planYear, 
bhsac.Ischecked, 
isnull(bhsac.Value,0) as EmployeeContribute, 
Id=(convert(varchar, bcl.Id) + '$' + convert(varchar, isnull(bhsac.Id, 0))) , 
bhsac.Value , 
bhsac.HSALmitId 
from  
dbo.benContributionStructure bcs 
inner join dbo.benVariableElection bve on bcs.PlanInfoId = bve.PlanInfoId 
inner join dbo.benBenefitContributionLimit bcl on bcs.SavingCategory =  bcl.CategoryID 
left outer join dbo.benBenefitHSACoverage bhsac on bcs.PlanInfoId = bhsac.planInfoId 
     and bcl.Id=bhsac.HSALmitId --and [email protected] 

left outer join dbo.benEmployeeContribution bec on bhsac.UserID = bec.UserId and bhsac.BenefitClassId = bec.BenefitClassId -- and bec.EnrollmentType !='Closed' 
left outer join benOpenEnrollment oems on oems.ID = bec.OpenEnrollmentId 
where  
bcs.PlanInfoId=38044 and bcl.Ischecked=1 
         and bcl.Tier !='CatchUp'  
    and bcl.CompanyId=1629 
    and bhsac.UserID='d76c5000-69e0-461e-92e1-3cfe7590d098' 
    and bhsac.PlanInfoId=38044 
    and oems.EndDt > GETDATE()    
Смежные вопросы