2017-12-27 30 views
1

私は2つのテーブルを持っています。私は1つの行に結果を取得すると仮定しますが、私は次のクエリを試してみると、重複が発生します。結合結果が重複

問い合わせ:参照のため

Select OrgaID, UnitID, LeaveTitle, NoOfFromService, NoOfToService, 
EmpType.EmployeeTypeName, IsExpatriate, 
(ALR.LeaveTypeShortName + '(' + convert(varchar,ALR.NoofDays) + ') | ' + 
MLR.LeaveTypeShortName + '(' + convert(varchar,MLR.NoofDays) + ') | ') 
Leaves 
From LeaveCategory LvCat  
Left Join (Select LeaveCategoryID, LeaveTypeShortName, NoofDays From 
LeaveEntitledEntry Where LeaveTypeShortName = 'AL') ALR On 
ALR.LeaveCategoryId = LvCat.Id 
Left Join (Select LeaveCategoryID, LeaveTypeShortName, NoofDays From 
LeaveEntitledEntry Where LeaveTypeShortName = 'MDL') MLR On 
ALR.LeaveCategoryId = LvCat.Id 
Where OrgaID = @OrgaID and LvCat.Status = 1 

表1:(LeaveCategory) enter image description here

表2:(LeaveEntitledEntry)

enter image description here

結果:

enter image description here

それでは、どのように私は私が期待される結果を達成するために参加し変更することができます。どんな助けもありがたい。事前に感謝します

答えて

1

条件付き集計を使用して、1つのサブクエリへの結合を使用して2種類の休暇データにアクセスすることができます。このトリックがうまくいく理由は、それぞれLeaveCategoryIDの単一のレコードを、とMDLタイプの両方の値のNoofDaysと一緒に生成できるようにするためです。これは、単一の結合で行うことができることを意味します。これにより、重複の問題を避けることができます。

WITH cte AS (
    SELECT 
     LeaveCategoryID, 
     MAX(CASE WHEN LeaveTypeShortName = 'AL' THEN NoofDays END) AS NoofDaysAL, 
     MAX(CASE WHEN LeaveTypeShortName = 'MDL' THEN NoofDays END) AS NoofDaysMDL 
    FROM LeaveEntitledEntry 
    GROUP BY LeaveCategoryID 
) 

SELECT 
    OrgaID, 
    UnitID, 
    LeaveTitle, 
    NoOfFromService, 
    NoOfToService, 
    EmpType.EmployeeTypeName, 
    IsExpatriate, 
    'AL(' + CONVERT(varchar, t.NoofDaysAL) + ') | ' + 
    'MDL(' + CONVERT(varchar, t. NoofDaysMDL) + ') | ') AS Leaves 
FROM LeaveCategory LvCat  
LEFT JOIN cte t 
    ON LvCat.Id = t.LeaveCategoryID 
WHERE 
    OrgaID = @OrgaID AND 
    LvCat.Status = 1; 
+0

ありがとう@Tim – Muzz