|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Nicolas Ingénieur développement logiciels Inscription : décembre 2006 Messages : 111 ![]() |
Bonjour à tous,
je fais des regroupement de tables avec des left joins. Malheureusement, lorsque une ligne de la table A a deux ou plus références avec la table B, la table A+B contient toutes les référence. Vu qu'il existe des quantités dans la table A, je ne voudrais pas que ces quantités se répètent dans la table résultante A+B. Par conséquent, je voudrais définir dans la table A+B une nouvelle colonne qui rassemble ("concat") toutes les références d'une même ligne. Si personne n'a rien compris, alors un exemple expliquerait tout: Code :
![]() Remarque: J'ai fait un exemple simple exprès, faut pas comprendre le sens des tables, mais leur logique. Merci d'avance, Nicolas |
||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Pour cela vous devez utiliser une requête récursive avec les CTE.
Lisez l'article que j'ai écrit à ce sujet; il y a de nombreux exemples qui répondent parfaitement à votre problème : http://sqlpro.developpez.com/cours/s...te-recursives/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 |
|
Membre du Club
![]() Nicolas Ingénieur développement logiciels Inscription : décembre 2006 Messages : 111 ![]() |
super merci
|
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Nicolas Ingénieur développement logiciels Inscription : décembre 2006 Messages : 111 ![]() |
J'ai lu votre cours plusieurs fois, mais en vain.
![]() Pourriez-vous donner un exemple simple avec l'exemple ci-dessus?? C'est sourtout l'addition de caractères ("club"[1] + ' et ' + "club"[2] => "Foot et tennis") que je dois faire. |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Voici un exemple à partir de vos données, que j'ai un enrichies... les différents club sont séparés par des virgules, sauf les deux derniers, séparés par "et" Code SQL :
|
||
|
|
00
|
|
|
#6 | ||
![]() ![]() |
Une autre solution, plus nébuleuse, mais plus courte.
Par contre elle ne change pas le dernier séparateur en 'et', et est extrêmement spécifique à SQL-Server : Code :
__________________
Email : http://scr.im/waldar |
||
|
10
|
|
|
#7 |
|
Membre du Club
![]() Nicolas Ingénieur développement logiciels Inscription : décembre 2006 Messages : 111 ![]() |
Super, merci beaucoup pour vos réponses
Existe-t-il une façon plus rapide pour regrouper les données? Par exemple, le group by, mais avec une concaténation des champs strings, c'est possible? Les CTE, c'est ce qu'il y a de plus adapté/optimal et s'il existe une autre solution pour éviter trop de gestion/calculs, c'est encore mieux. En effet, je dois gérer plus de 20 tables interconnectées et adapter les solutions avec la récursivité prendraient plusieurs jours pour un résultat qui a l'air simple.
|
|
|
00
|
|
|
#8 |
|
Membre du Club
![]() Nicolas Ingénieur développement logiciels Inscription : décembre 2006 Messages : 111 ![]() |
Après plein de recherches sur le net ( par exemple: http://www.eggheadcafe.com/software/...-group-by.aspx ), j'ai vu que with + CTE, c'est le mieux
![]() Bref, merci encore pour vos réponses ![]() a+ |
|
|
00
|
|
|
#9 |
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 723 ![]() |
J'ai pu constater par expérience que la méthode à employer dépendant de beaucoup la volumétrie des données à concaténer (et bien entendu des index placés)
Par exemple l'emploi des CTE récursives étaient beaucoup mois performantes que la concaténation via les méthodes XPATH lorsque j'arriverais dans mon cas à plus de 100 000 lignes. Je pense qu'il est important pour vous de prendre ceci en considération. ++ |
|
00
|
|
|
#10 |
![]() ![]() |
Je rejoins mikedavem sur ce point, "mieux" est dépendant des personnes et des environnements.
Certains préféreront avoir une UDF plus lente mais plus simple d'utilisation, d'autres préféreront la syntaxe normative à base de CTE, d'autres préféreront la solution plus rapide avec XML Path. Ça dépend vraiment de vos contraintes et de ce que vous êtes prêt à coder.
__________________
Email : http://scr.im/waldar |
|
00
|
Copyright © 2000-2012 - www.developpez.com