2009-11-20 3 views
1

Ma situation:Obtenez les derniers enfants de la base de données

Table A 
(
ID 
Parent_Id 
TimeStamp 
) 

La racine a PARENT_ID nulle et les enfants a Id de son père.

Je veux simplement obtenir tous les DERNIERS enfants de chaque Table A. Père et Enfants je ne veux pas. (sauf le dernier).

Est-il possible de créer un SQL pour l'obtenir? PS: Je suis sur sql n'importe où 11. Peut-être un ansi sql peut résoudre ce problème, je ne suis pas sûr.

EDIT: (édité pour donner des détails supplémentaires) Je ne veux pas les derniers enfants d'un élément.

Exemple:

Id 1 Parent NULL

Id 2 Parent 1

Id 3 (le dernier enfant) Parent 1

Id 4 Parent NULL

Id 5 (le dernier enfant) parent 4

Je veux: Id 3 Id 5

+0

S'il vous plaît, passez en revue votre réponse parce que j'ai donné des détails supplémentaires. – Ismael

Répondre

3

en utilisant la fonction stockée

create function LastChild(in parent integer) 
returns integer 
begin 
    declare res integer; 
    select top 1 id into res from TableA where parent_id = parent order by timeCol desc; 
    return res; 
end 

select

select Id, lastchild(id) from TAbleA where parent_id is null 

Je vais travailler sur une autre solution sans fonction stockée.

EDIT: sans fonction stockée:

select Id, (select top 1 id from TableA childs where parent_id = TableA.id order by timeCol desc) from TableA where parent_id = 0 
+1

Oui! cette fonction a renvoyé exactement ce que je voulais. Merci. – Ismael

+1

Merci encore, la version sql sans fonction a été plus appropriée pour moi. – Ismael

0
select * from a where id not in (select parent_id from table a) 

En d'autres termes, sélectionnez tout de la table un où l'ID de l'article n'est pas l'ID parent de tout autre élément. Cela vous donnera tous les nœuds feuilles du graphique.

EDIT:
Votre modification est un peu confus, et les ID ne sont généralement pas utilisés comme mécanismes de commande, mais peu importe, l'exemple que vous donnez peut être accompli par cette requête

SELECT MAX(id) 
FROM a 
WHERE id NOT IN 
    (SELECT parent_id 
     FROM a 
     WHERE parent_id IS NOT NULL 
) 
GROUP BY parent_id 
3

Si par « dernier enfants » signifient les éléments qui ont eux-mêmes pas d'enfants (et souvent désignés comme éléments de niveau feuille), quelque chose comme cela devrait faire:

SELECT ID 
from A 
where ID not in (select Parent_Id from A) 

La version sous-requête corrélée est un peu Tricker à comprendre, mais fonctionnerait plus rapidement sur de grandes tables:

SELECT ID 
from A OuterReference 
where not exists (select 1 from A where Parenti_ID = OuterReference.ID) 

(« OuterReference » est un alias pour le tableau A)

J'utilise SQL Server, mais cela est une syntaxe assez basique et devrait fonctionner pour vous avec un minimum de modifications.

+0

(années plus tard, oops) ajuste la sous-requête de ce premier à lire '(sélectionnez Parent_Id de A où Parent_Id n'est pas nul)'. Les éléments de niveau supérieur auront un ParentId nul, et le fait d'avoir des valeurs nulles dans la liste de la sous-requête va gâcher les choses. –

Questions connexes