Requete concatenant les lignes d'une table dans un champ unique d'une autre

Le
Dolten Altgor
Bonjour à tous,

Je suis confronté à la problématique suivante:

table_1
--

id mc
--
1 pomme
1 poire
1 banane

j'aurais souhaité mettre à jour une autre table en concatenant tous les mc
pour un id donné de manière à avoir ceci:

table_2
--

id mc
-- -

1 pomme | poire | banane

Cela paraît simple et j'avais réussi il y a quelque temps à le faire avec
access une requete update du type:

UPDATE table_2
SET mc = table2.mc' ' | ' + table_1..mc
FROM table_1 INNER JOIN
table_2 ON table_1.id = table_1.id

Mais avec sql server cela ne marche pas
Merci!
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
zoltix
Le #18376421
On 12 jan, 16:57, "Dolten Altgor"
Bonjour à tous,

Je suis confronté à la problématique suivante:

table_1
--------

id    mc
--   ---
1    pomme
1    poire
1    banane

j'aurais souhaité mettre à jour une autre table en concatenant tous l es mc
pour un id donné de manière à avoir ceci:

table_2
--------

id    mc
--   ----

1    pomme | poire | banane

Cela paraît simple et j'avais réussi il y a quelque temps à le fair e avec
access une requete update du type:

UPDATE    table_2
SET              mc =  table2.mc'  ' | '  +  tabl e_1..mc
FROM         table_1 INNER JOIN
                      table_2 ON table_1.id = tab le_1.id

Mais avec sql server cela ne marche pas...
Merci!




Déjà ce n'est pas terrible d'avoir un champ id qui n'est pas
unique.... Ceci dit je ne vois pas d'autre solution que de creer un
curseur....

A+
bruno reiter
Le #18383071
Si tu es sur SQL2005, crées une fonction d'agrégation CLR, il y a plein d'ex
sur le NET

BR

"Dolten Altgor" news:
Bonjour à tous,

Je suis confronté à la problématique suivante:

table_1
--------

id mc
-- ---
1 pomme
1 poire
1 banane

j'aurais souhaité mettre à jour une autre table en concatenant tous les mc
pour un id donné de manière à avoir ceci:

table_2
--------

id mc
-- ----

1 pomme | poire | banane

Cela paraît simple et j'avais réussi il y a quelque temps à le faire avec
access une requete update du type:

UPDATE table_2
SET mc = table2.mc' ' | ' + table_1..mc
FROM table_1 INNER JOIN
table_2 ON table_1.id = table_1.id

Mais avec sql server cela ne marche pas...
Merci!






brouardf
Le #18388911
C'est parfaitement possible en une seule requête sans fonctions avec
une requête récursive introduite par la CTE.
A ce sujet, lire l'article que j'ai publié, il y a plusieurs
exemples : http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/

Dans votre cas :

CREATE TABLE table_1 (id int, mc varchar(8))

INSERT INTO table_1 VALUES (1, 'pomme')
INSERT INTO table_1 VALUES (1, 'poire')
INSERT INTO table_1 VALUES (1, 'banane')
INSERT INTO table_1 VALUES (2, 'prune')
INSERT INTO table_1 VALUES (2, 'banane')

WITH
T1 AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY mc) AS N,
COUNT(*) OVER(PARTITION BY id) AS C
FROM table_1),
T2 AS
(SELECT id, N, C, CAST(mc AS VARCHAR(max)) AS mots
FROM T1
WHERE N = 1
UNION ALL
SELECT T1.id, T1.N, T1.C, mots + ', ' + T1.mc
FROM T1
INNER JOIN T2
ON T2.N + 1 = T1.N
AND T1.id = T2.id)
SELECT id, mots
FROM T2
WHERE N = C

id mots
----------- ----------------------------
2 banane, prune
1 banane, poire, pomme


A +
__________________
Frédéric BROUARD, Spécialiste modélisation, bases de données,
optimisation, langage SQL.
Le site sur le langage SQL et les S.G.B.D. relationnels :
http://sqlpro.developpez.com/
Expert SQL Server http://www.sqlspot.com : audit, optimisation,
tuning, formation
* * * * * Enseignant au CNAM PACA et à l'ISEN à Toulon * * * * *


On 12 jan, 16:57, "Dolten Altgor"
Bonjour à tous,

Je suis confronté à la problématique suivante:

table_1
--------

id mc
-- ---
1 pomme
1 poire
1 banane

j'aurais souhaité mettre à jour une autre table en concatenant tous l es mc
pour un id donné de manière à avoir ceci:

table_2
--------

id mc
-- ----

1 pomme | poire | banane

Cela paraît simple et j'avais réussi il y a quelque temps à le fair e avec
access une requete update du type:

UPDATE table_2
SET mc = table2.mc' ' | ' + table_1..mc
FROM table_1 INNER JOIN
table_2 ON table_1.id = table_1.id

Mais avec sql server cela ne marche pas...
Merci!


Dolten Altgor
Le #18389821
merci!


C'est parfaitement possible en une seule requête sans fonctions avec
une requête récursive introduite par la CTE.
A ce sujet, lire l'article que j'ai publié, il y a plusieurs
exemples : http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/

Dans votre cas :

CREATE TABLE table_1 (id int, mc varchar(8))

INSERT INTO table_1 VALUES (1, 'pomme')
INSERT INTO table_1 VALUES (1, 'poire')
INSERT INTO table_1 VALUES (1, 'banane')
INSERT INTO table_1 VALUES (2, 'prune')
INSERT INTO table_1 VALUES (2, 'banane')

WITH
T1 AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY id ORDER BY mc) AS N,
COUNT(*) OVER(PARTITION BY id) AS C
FROM table_1),
T2 AS
(SELECT id, N, C, CAST(mc AS VARCHAR(max)) AS mots
FROM T1
WHERE N = 1
UNION ALL
SELECT T1.id, T1.N, T1.C, mots + ', ' + T1.mc
FROM T1
INNER JOIN T2
ON T2.N + 1 = T1.N
AND T1.id = T2.id)
SELECT id, mots
FROM T2
WHERE N = C

id mots
----------- ----------------------------
2 banane, prune
1 banane, poire, pomme


A +
__________________
Frédéric BROUARD, Spécialiste modélisation, bases de données,
optimisation, langage SQL.
Le site sur le langage SQL et les S.G.B.D. relationnels :
http://sqlpro.developpez.com/
Expert SQL Server http://www.sqlspot.com : audit, optimisation,
tuning, formation
* * * * * Enseignant au CNAM PACA et à l'ISEN à Toulon * * * * *


On 12 jan, 16:57, "Dolten Altgor"
Bonjour à tous,

Je suis confronté à la problématique suivante:

table_1
--------

id mc
-- ---
1 pomme
1 poire
1 banane

j'aurais souhaité mettre à jour une autre table en concatenant tous les mc
pour un id donné de manière à avoir ceci:

table_2
--------

id mc
-- ----

1 pomme | poire | banane

Cela paraît simple et j'avais réussi il y a quelque temps à le faire avec
access une requete update du type:

UPDATE table_2
SET mc = table2.mc' ' | ' + table_1..mc
FROM table_1 INNER JOIN
table_2 ON table_1.id = table_1.id

Mais avec sql server cela ne marche pas...
Merci!


Publicité
Poster une réponse
Anonyme