0
votes

Comment obtenir le nombre de nœuds enfants dans une arborescence en SQL

Mon objectif est de lister le nom et le nombre d'enfants de chaque membre d'une famille utilisant MS SQL:

Exemple d'arbre généalogique dans l'image (basé sur l'ID)

! [entrez la description de l'image ici] [1]

Les tableaux que j'ai sont:

  1. Famille

    +----------------+--------------------+
    | f_name         | number of children |
    +----------------+--------------------+
    | Name Surname 1 | 2                  |
    +----------------+--------------------+
    | Name Surname 2 | 2                  |
    +----------------+--------------------+
    | Name Surname 3 | 3                  |
    +----------------+--------------------+
    | Name Surname 7 | 1                  |
    +----------------+--------------------+
    | Name Surname 8 | 1                  |
    +----------------+--------------------+
    
  2. Rapports

    +----------+---------+
    | r_parent | r_child |
    +----------+---------+
    | 1        | 2       |
    +----------+---------+
    | 1        | 3       |
    +----------+---------+
    | 2        | 4       |
    +----------+---------+
    | 2        | 5       |
    +----------+---------+
    | 3        | 6       |
    +----------+---------+
    | 3        | 7       |
    +----------+---------+
    | 3        | 8       |
    +----------+---------+
    | 7        | 9       |
    +----------+---------+
    | 8        | 10      |
    +----------+---------+

Les résultats nécessaires sont MIS À JOUR

+------+-----------------+
 | f_id | f_name          |
 +------+-----------------+
 | 1    | Name Surname 1  |
 +------+-----------------+
 | 2    | Name Surname 2  |
 +------+-----------------+
 | 3    | Name Surname 3  |
 +------+-----------------+
 | 4    | Name Surname 4  |
 +------+-----------------+
 | 5    | Name Surname 5  |
 +------+-----------------+
 | 6    | Name Surname 6  |
 +------+-----------------+
 | 7    | Name Surname 7  |
 +------+-----------------+
 | 8    | Name Surname 8  |
 +------+-----------------+
 | 9    | Name Surname 9  |
 +------+-----------------+
 | 10   | Name Surname 10 |
 +------+-----------------+

Merci pour l'aide [1]: https://i.stack.imgur.com/SwJB9.png


5 commentaires

Et comment les résultats sont-ils calculés? Ce n'est pas évident pour les noms de famille 3, 7 et 8.


Le tableau des relations montre que les parents ont des enfants et l'image de l'arbre généalogique montre que chaque père a combien d'enfants


Comment le nombre est-il calculé? Vos résultats ne correspondent pas aux données que vous avez fournies.


Les résultats nécessaires sont corrigés, il était basé sur un exemple avec moi, désolé. c'est maintenant correct


la question est mise à jour


3 Réponses :


0
votes

Cela ressemble à une join et une agrégation de base:

with cte as (
      select r.parent, r.r_id
      from relations r
      union all
      select cte.parent, r.r_id
      from cte join
           relations r
           on r.parent = cte.r_id
    )
select parent, count(*) as num_children
from cte
group by parent;

Je pensais que vous vouliez compter les enfants à travers les générations. Cela nécessite un CTE récursif:

select f.f_name, count(*)
from family f join
     relations r
     on f.f_id = r.parent
group by f.f_name, f.f_id;


0 commentaires

0
votes
SELECT family.f_id
    ,rel.[number of children]
FROM family
JOIN (
    SELECT r_parent
        ,count(*) AS [number of children]
    FROM relations
    GROUP BY r_parent
    ) rel ON rel.r_parent = family.f_id

0 commentaires

0
votes

Et un autre évitant le compte (*)

SELECT
    *
FROM
    (
        SELECT
            F.f_name,
            (SELECT Count(1) FROM Relations R WHERE R.r_parent = F.f_id) [number of children]
        FROM
            Family F
    ) Fathers
WHERE
    Fathers.[number of children] > 0

en plus un avec l'utilisation de la sous-requête

SELECT
    F.f_name,
    COUNT(1) [number of children]
FROM
    Family F
    JOIN Relations R ON R.r_parent = F.f_id
GROUP BY
    F.f_name


0 commentaires