запрос one-many, выбирающий всех родителей и единственного главного ребенка для каждого родителя

Редактирование: тем, кто настаивает на downvoting... Невозможно удалить этот ответ, потому что это - принятая версия. Поэтому редактирую для включения корректного ответа ( код JaredPar ниже)

Достаточно простой, если Вы только хотите получить Выполняющийся блок:

using System.Reflection;

Assembly assembly = Assembly.GetExecutingAssembly();

//The following line (part of the original answer) is misleading.
//**Do not** use it unless you want to return the System.Reflection.Assembly type's GUID.
Console.WriteLine(assembly.GetType().GUID.ToString());


// The following is the correct code.
var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute),true)[0];
var id = attribute.Value;

20
задан Bill Karwin 3 December 2009 в 20:33
поделиться

3 ответа

select p.id, p.text, c.id, c.parent, c.feature
from Parents p
left join (select c1.id, c1.parent, c1.feature
             from Childs c1
             join (select p1.id, max(c2.feature) maxFeature
                     from Parents p1
                left join Childs c2 on p1.id = c2.parent
            group by p1.id) cf on c1.parent = cf.id 
                              and c1.feature = cf.maxFeature) c
on p.id = c.parent
17
ответ дан 30 November 2019 в 00:19
поделиться

Использование CTE (SQL Server 2005 +):

WITH max_feature AS (
   SELECT c.id,
          c.parent,
          MAX(c.feature) 'feature'
     FROM CHILD c
 GROUP BY c.id, c.parent)
   SELECT p.id,
          p.text,
          mf.id,
          mf.parent,
          mf.feature
     FROM PARENT p
LEFT JOIN max_feature mf ON mf.parent = p.id

Эквивалент без CTE:

   SELECT p.id,
          p.text,
          mf.id,
          mf.parent,
          mf.feature
     FROM PARENT p
LEFT JOIN (SELECT c.id,
                  c.parent,
                  MAX(c.feature) 'feature'
             FROM CHILD c
         GROUP BY c.id, c.parent) mf ON mf.parent = p.id

В вашем вопросе не хватает деталей для обработки разрешающих моментов (когда 2+ CHILD.id значения имеют одинаковое значение функции). В ответе Agent_9191 используется TOP 1 , но он возьмет первый, который возвращается, и не обязательно тот, который вам нужен.

9
ответ дан 30 November 2019 в 00:19
поделиться

Это должно работать:

SELECT p.id, p.text, c.id, c.parent,c.feature
FROM parent p
 LEFT OUTER JOIN (SELECT TOP 1 child.id,
                               child.parent,
                               MAX(child.feature)
                  FROM child
                  WHERE child.parent = p.id
                  GROUP BY child.id, child.parent
                  ) c ON p.id = c.parent
4
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: