2011-05-31 44 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