1

トリッキーなクエリがあります。管理者グループの2種類のメンバーの最新バージョンをすべて選択する必要があります。クエリは次のとおりです。

SELECT refGroup.*
FROM tblSystemAdministratorGroups refGroup
JOIN tblGroup refMem ON refGroup.AttributeValue = refMem.ObjectUID

このクエリは、すべての管理者グループを返します。次のステップは、これらのグループのメンバーを取得することです。私は2種類のメンバーシップ(Explicit、Computed)を持っているLEFT JOINので、行を除外していないことを確認するためにを使用する必要があります。

SELECT refGroup.*
FROM tblSystemAdministratorGroups refGroup
-- The JOIN bellow can be excluded but it is here just to clarify the architecture
JOIN tblGroup refMem ON refGroup.AttributeValue = refMem.ObjectUID
LEFT JOIN tblGroup_ComputedMember cm ON refMem.ObjectUID = cm.GroupObjectID
LEFT JOIN tblGroup_ExplicitMember em ON refMem.ObjectUID = em.GroupObjectID

パズルの最後のピースは、各メンバーの最新バージョンを入手することです。そのためJOINに、古いバージョンを除外するために使用する必要があります。

JOIN (
    SELECT MAX([ID]) MaxId 
    FROM [OmadaReporting].[dbo].tblGroup_ComputedMember 
    GROUP BY ObjectID  
) MostRecentCM ON MostRecentCM.MaxId = cm.Id

JOIN (
    SELECT MAX([ID]) MaxId 
    FROM [OmadaReporting].[dbo].tblGroup_ExplicitMember 
    GROUP BY ObjectID  
) MostRecentEM ON MostRecentEM.MaxId = em.Id

完全なクエリは次のようになります。

SELECT refGroup.*
FROM tblSystemAdministratorGroups refGroup
JOIN tblGroup refMem ON refGroup.AttributeValue = refMem.ObjectUID
LEFT JOIN tblGroup_ComputedMember cm ON refMem.ObjectUID = cm.GroupObjectID
JOIN (
    SELECT MAX([ID]) MaxId 
    FROM [OmadaReporting].[dbo].tblGroup_ComputedMember 
    GROUP BY ObjectID  
) MostRecentCM ON MostRecentCM.MaxId = cm.Id
LEFT JOIN tblGroup_ExplicitMember em ON refMem.ObjectUID = em.GroupObjectID
JOIN (
    SELECT MAX([ID]) MaxId 
    FROM [OmadaReporting].[dbo].tblGroup_ExplicitMember 
    GROUP BY ObjectID  
) MostRecentEM ON MostRecentEM.MaxId = em.Id

問題は明らかです。JOIN古いバージョンを除外する2つはselectステートメントにも適用され、明らかに行は返されません。そのような状況を回避し、意図した値を返すための最良の解決策は何でしょうか?

4

2 に答える 2

2
SELECT refGroup.*
FROM tblSystemAdministratorGroups refGroup
JOIN tblGroup refMem ON refGroup.AttributeValue = refMem.ObjectUID
LEFT JOIN (
    select GroupObjectID, ID, max(ID) over (partition by ObjectID) as maxID
    from tblGroup_ComputedMember
) cm ON refMem.ObjectUID = cm.GroupObjectID and cm.ID = cm.maxID
LEFT JOIN (
    select GroupObjectID, ID, max(ID) over (partition by ObjectID) as maxID
    from tblGroup_ExplicitMember
) em ON refMem.ObjectUID = em.GroupObjectID and em.ID = em.maxID
where cm.ID = cm.MaxID
于 2013-02-20T10:29:50.923 に答える
2

最後の 2 つの結合で LEFT 結合を使用するのはどうですか?

LEFT JOIN (
    SELECT MAX([ID]) MaxId 
    FROM [OmadaReporting].[dbo].tblGroup_ComputedMember 
    GROUP BY ObjectID  
) MostRecentCM ON MostRecentCM.MaxId = cm.Id

次に、Where 句で値を次のようにフィルター処理します。

WHERE MostRecentCM.MaxId IS NOT NULL 
      OR
      MostRecentEM.MaxId IS NOT NULL
于 2013-02-20T10:19:43.530 に答える