Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
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!

4 réponses

Avatar
zoltix
On 12 jan, 16:57, "Dolten Altgor" wrote:
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+
Avatar
bruno reiter
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" wrote in message
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!






Avatar
brouardf
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" wrote:
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!


Avatar
Dolten Altgor
merci!

a écrit dans le message de news:

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" wrote:
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!