2011-05-31 45 views
3

我有几个看起来有点像这样的模型:家长与子女有1-2米的关系,子女与子女有1-2米的关系。SQL:选择最新子女的位置

Parent 
------ 
Parent_ID 


Child 
----- 
Child_ID, 
Parent_ID 


Sub-Child 
--------- 
Child_ID, 
Version_Number (numeric), 
Sent (date), 
Void (date) 

我想查询返回的独特PARENT_ID的其中一个相关的子儿的最新版本(由VERSION_NUMBER判断)为'sent' == null,但'void' != null列表。

我一直在我的脑海中咀嚼这些东西,无法弄清楚。

任何意见将不胜感激。

感谢,

罗伯特

回答

1

我不是在那里我可以测试这一点,但它听起来像是你需要一个子查询拉每一个孩子的最高版本号,然后自连接获取其余的子子项信息。像这样的东西是什么,我想:

SELECT DISTINCT 
    Parent_ID 
FROM 
    Parent JOIN Child 
    ON Parent.Parent_ID = Child.Parent_ID 
    JOIN (
    SELECT Child_ID, MAX(Version_Number) 
    FROM Sub-Child 
    GROUP BY Child_ID) AS MaxSubchild 
    JOIN Sub-Child 
    ON Sub-Child.Child_ID = MaxSubchild.Child_ID AND 
     Sub-Child.Version_Number = MaxSubchild.Version_Number 
WHERE 
    SUb-Child.Sent IS NULL AND 
    Sub-Child.Void IS NOT NULL; 
3

这将是这样的:

;WITH CTE_LatestSubChildren AS 
(
    SELECT Parent_ID, Latest_Version_Number = max(sc.Version_Number) 
    FROM 
     Child c 
     JOIN [Sub-Child] sc on c.Child_ID = sc.Child_ID 
    GROUP BY c.Parent_ID 

) 
SELECT 
    ParentID 
FROM 
    CTE_LatestSubChildren lsc 
    JOIN Child c 
     on lsc.Parent_ID = c.Parent_ID 
    JOIN [Sub-Child] sc 
     ON sc.Child_ID = c.Child_ID  
     AND sc.version_number = lsc.Latest_Version_Number 
     AND sc.Sent IS NULL  
     AND sc.Void IS NOT NULL 

注意,这可能需要修正为没有经过测试,它还不完全清楚会发生什么关于最新版本相同的多个子记录。

0

开始由child_id获得最高版本:

select child_id, max(version_number) as version_number 
from subchild 
group by child_id 

它再加入一个子查询,以subchild和儿童,并应用WHERE条件。

0

或者没有子查询,尝试,

SELECT DISTINCT p.parent_id 
FROM sub_children sc 
    LEFT JOIN children c ON sc.parent_id = c.child_id 
    LEFT JOIN parents p ON c.parent_id = p.parent_id 
WHERE sc.sent == null, but sc.void != null 
0

您还可以使用RANK():

SELECT DISTINCT TOP 100 PERCENT ST.Parent_ID 
FROM 
(
    SELECT RANK() OVER (PARTITION BY C.Parent_ID ORDER BY SC.Version_Number DESC) AS [RANK], 
    C.Parent_ID, SC.Sent, SC.Void 
    FROM Child C 
    INNER JOIN Sub_Child SC ON C.Child_ID = SC.Child_ID 
) ST 
WHERE [RANK] = 1 
AND [Sent] IS NULL AND [Void] IS NOT NULL