SQL Server Équivalent d'Oracle 'CONNECT BY prior", et "l'ORDRE des FRÈRES EN'
J'ai cet Oracle code structure je suis en train de convertir vers SQL Server 2008 (Remarque: j'ai utilisé des noms génériques, joint colonne des noms et des noms de table dans des crochets '[]', et fait un peu de mise en forme pour rendre le code plus lisible):
SELECT [col#1], [col#2], [col#3], ..., [col#n], [LEVEL]
FROM (SELECT [col#1], [col#2], [col#3], ..., [col#n]
FROM [TABLE_1]
WHERE ... )
CONNECT BY PRIOR [col#1] = [col#2]
START WITH [col#2] IS NULL
ORDER SIBLINGS BY [col#3]
Qu'est-ce que le Serveur SQL équivalent modèle le code ci-dessus?
Plus précisément, je suis aux prises avec le NIVEAU, et de "l'ORDRE FRÈRES et sœurs PAR' Oracle des constructions.
Remarque:
Ci-dessus "code" est le résultat final à partir d'un ensemble de procédures d'Oracle. Fondamentalement, la clause'where' est construit dynamiquement et change en fonction de différents paramètres passés. Le bloc de code commençant par "CONNECT BY prior' est codé en dur.
Pour Référence:
La Simulation de CONNECTER EN AVANT de l'ORACLE, SQL SERVER article vient de fermer, mais il n'explique pas comment gérer le "NIVEAU" et l '" ORDRE que les FRÈRES et sœurs des constructions. ... Et de mon esprit, c'est arriver dans une torsion!
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
équivaut à:
WITH n(empid, name) AS
(SELECT empid, name
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT nplus1.empid, nplus1.name
FROM emp as nplus1, n
WHERE n.empid = nplus1.mgrid)
SELECT name FROM n
Si j'ai un modèle initial de travailler de la, il ira un long chemin pour m'aider à construire stockée SQL Server envisageable de construire une bonne instruction T-SQL.
De l'aide sera très appréciée.
Ceci est un extrait directement à partir stockée Oracle proc: vSQL := 'SELECT FLEX_VALUE, DESCRIPTION, ADMIN_ENABLED, PARENT_FLEX_VALUE, DISPLAY_DESC, le NIVEAU DE ('|| 'SELECT FLEX_VALUE, DESCRIPTION, ADMIN_ENABLED, PARENT_FLEX_VALUE, '||vDescField||' DISPLAY_DESC '|| 'à PARTIR de GL_SEGMENT'||TO_CHAR(inSEGMENT)||' '|| 'OÙ PERIOD_YEAR = '||inPERIOD_YEAR||' '; ...... Note le "OÙ PERIOD_YEAR' ......
Mais la syntaxe est le moindre de mes soucis. J'ai besoin d'un T-SQL équivalent de l'oracle de la structure.
double possible de Simulation de CONNECTER EN AVANT de l'ORACLE, SQL SERVER
Pour l'enregistrement, j'ai utilisé [..] pour m'aider à identifier entre les noms de colonnes et les mots clés. J'ai également ajouté les sauts de ligne et les tabulations, etc. Je ne suis pas un SQL expert, et le sql brut est pas formaté!
OriginalL'auteur user1058946 | 2015-08-05
Vous devez vous connecter pour publier un commentaire.
La simulation de la colonne de NIVEAU
Au niveau de la colonne peut facilement être simulé par incrémentation d'un compteur dans la partie récursive:
Simulant
order siblings by
Simulant le
order siblings by
est un peu plus compliqué. En supposant que nous avons une colonnesort_order
qui définit l'ordre des éléments par parent (et non l'ensemble de l'ordre de tri - parce qu'alorsorder siblings
ne serait pas nécessaire) alors nous pouvons créer une colonne qui nous donne un ensemble de l'ordre de tri:L'expression de la
sort_path
ressemble tellement compliqué parce que SQL Server (au moins la version que vous utilisez) n'est pas une fonction simple pour formater un nombre de zéros. Dans Postgres je voudrais utiliser un tableau d'entiers, de sorte que la conversion àvarchar
n'est pas nécessaire - mais qui ne fonctionne pas dans SQL Server.le deuxième exemple montre que
Oui! Cela ressemble à cela pourrait fonctionner. En supposant que sort_order colonne est déjà juste une chaîne de texte comme quelque chose de "R301 - Zone de Gestion" ou "R402 - le Personnel Occasionnel" - alors il devrait fonctionner ... j'espère. L'original Oracle code semble être la seule à trier par "l'enfant". Il affiche le "parent_code' séparément pour chaque ligne dans les résultats. ... Je vais essayer cela dès maintenant. 🙂
Cela fonctionne! :))
OriginalL'auteur a_horse_with_no_name
L'option donnée par l'utilisateur "a_horse_with_no_name" a fonctionné pour moi. J'ai changé le code et l'a appliqué à un générateur de menu de requête et cela a fonctionné la première fois. Voici le code:
OriginalL'auteur wtave