SQL: выбор места последнего дочернего элемента - PullRequest
3 голосов
/ 31 мая 2011

У меня есть несколько моделей, которые выглядят примерно так: родитель имеет отношения 1-2-M с ребенком, а ребенок имеет отношения 1-2-M с дочерним ребенком.

Parent
------
Parent_ID


Child
-----
Child_ID,
Parent_ID


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

Мне нужен запрос, который возвращает список уникальных идентификаторов parent_id, где последняя версия (по номеру версии) соответствующего дочернего элемента 'sent' == null, но 'void' != null.

Я переваривал это в своей голове и не могу понять, что.

Любой совет будет принят с благодарностью.

Спасибо

Роберт

Ответы [ 5 ]

3 голосов
/ 31 мая 2011

Это будет что-то вроде:

;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

Обратите внимание, что для этого могут потребоваться изменения, поскольку они не проверены, и не совсем ясно, что должно происходить с несколькими дочерними записями, где последняя версия одинакова.

1 голос
/ 31 мая 2011

Я не там, где я могу проверить это, но, похоже, вам понадобится подзапрос, чтобы получить максимальные номера версий каждого дочернего элемента, а затем самообъединение, чтобы получить остальную информацию дочернего элемента. Примерно так я и думаю:

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;
0 голосов
/ 01 июня 2011

Вы также можете использовать 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
0 голосов
/ 31 мая 2011

Или, без подзапросов, попробуйте,

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 голосов
/ 31 мая 2011

Начните с получения максимальной версии child_id:

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

Затем присоединитесь к нему как подзапросу с подчиненным и дочерним и примените условие where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...