1

我有一个棘手的问题。我需要选择管理员组的 2 类成员的所有最新版本。这是查询:

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

此查询将返回所有管理员组。下一步将是获取这些组的成员。由于我有 2 种类型的成员资格(显式、计算),我将不得不使用 aLEFT 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

在最后两个连接中使用 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 回答
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 回答