je la fonction d'une valeur de table récursive suivante dans MS SQL, afin de récupérer une hiérarchie d'objets de la base de données:Condition dans une requête récursive
WITH tmpField (ParentNum, ChildNum, FieldNum, FieldDescr, Iteration) AS
(
SELECT Field.ParentNum, Field.ChildNum, Field.FieldNum, Field.FieldDescr, 1
FROM Field
WHERE Field.ParentNum = @ParentNum
UNION ALL
SELECT Field.ParentNum, Field.ChildNum, Field.FieldNum, Field.FieldDescr, tmpField.Iteration + 1
FROM Field INNER JOIN
tmpField on Field.ParentNum = tmpField.ChildNum
)
SELECT DISTINCT ParentNum AS ParentNum, ChildNum AS ChildNum, FieldNum, FieldDescr
FROM tmpField
Je veux modifier la façon suivante:
Dans la dernière itération, quand il n'y a plus « enfants », je veux le champ ChildNum
d'avoir la valeur de FieldNum
. Dans toutes les itérations précédentes, ChildNum
doit avoir la valeur du champ ChildNum
, comme c'est le cas maintenant.
Quelqu'un peut-il suggérer une méthode pour y parvenir, en utilisant la requête ci-dessus comme point de départ?
Veuillez noter: malgré son nom, le champ ChildNum
ne fait référence à aucun enfant d'une rangée, mais il doit être interprété comme l'identifiant de cette ligne.
Non, malheureusement , ChildNum n'est pas null dans ce cas. Vous devriez lire ChildNum comme l'identifiant de la ligne courante, pas comme une référence à une autre ligne. La dénomination est gênante, je sais, mais c'est malheureusement hors de mon contrôle :) – Daan
Votre édition ressemble à un bon moyen d'accomplir cela. Malheureusement, en essayant de modifier ma fonction, il donne maintenant l'erreur suivante: GROUP BY, HAVING, ou les fonctions d'agrégat ne sont pas autorisés dans la partie récursive d'une expression de table commune récursif 'tmpField'. Des suggestions pour une solution de contournement? – Daan
Au lieu de CASE QUAND (SELECT COUNT (1) ...) = 0 ALORS numChamp AUTRE ChildNum FIN vous devez utiliser CASE QUAND exist (Select * from ...) ALORS ChildNum AUTRE numChamp END Le second fonctionne plus rapidement – Niikola