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

eviter boucle, quelle soluce CTE ???

6 réponses
Avatar
msnews.microsoft.com
--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une sorte
de select comme ça


--voici le bout de code pour illustrer


CREATE TABLE TEST (ID INT IDENTITY(1,1) PRIMARY KEY, CODE VARCHAR(50))

INSERT INTO test (code) VALUES ('100;1001')
INSERT INTO test (code) VALUES ('788')
INSERT INTO test (code) VALUES ('100;1001;888')
INSERT INTO test (code) VALUES ('150;178,188')
INSERT INTO test (code) VALUES ('100')


--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une sorte
de select comme ça

SELECT y.*
FROM ( SELECT ID, CODE
FROM test) AS Z
INNER JOIN
(SELECT z.ID, RESULT
FROM MASTER.dbo.mafunctionSplit(z.CODE,';')) Y
ON y.id = z.id


--pour avoir cela comme resultat

ID CODE
1 100
1 1001
2 788
3 100
3 1001
3 888
4 150
4 178
4 188
5 100

6 réponses

Avatar
msnews.microsoft.com
Bonjour à tous,

je crois que j'ai pas été au point sur le copié collé.

mais du coup personne n'a une idée ?
je suis obligé de faire une vilaine boucle ?



"msnews.microsoft.com" a écrit dans le message de
news:
--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça


--voici le bout de code pour illustrer


CREATE TABLE TEST (ID INT IDENTITY(1,1) PRIMARY KEY, CODE VARCHAR(50))

INSERT INTO test (code) VALUES ('100;1001')
INSERT INTO test (code) VALUES ('788')
INSERT INTO test (code) VALUES ('100;1001;888')
INSERT INTO test (code) VALUES ('150;178,188')
INSERT INTO test (code) VALUES ('100')


--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça

SELECT y.*
FROM ( SELECT ID, CODE
FROM test) AS Z
INNER JOIN
(SELECT z.ID, RESULT
FROM MASTER.dbo.mafunctionSplit(z.CODE,';')) Y
ON y.id = z.id


--pour avoir cela comme resultat

ID CODE
1 100
1 1001
2 788
3 100
3 1001
3 888
4 150
4 178
4 188
5 100


Avatar
Patrice
A brûle pourpoint ma préférence personnelle serait plutôt de faire le
contraire cad travailler avec des données normalisées et mettre en forme
quand le besoin s'en fait sentir plutôt que d'avoir des données
dénormalisées et de devoir les remettre en forme à chaque fois que je veux
faire une requête...


--
Patrice

"msnews.microsoft.com" a écrit dans le message de
groupe de discussion :
Bonjour à tous,

je crois que j'ai pas été au point sur le copié collé.

mais du coup personne n'a une idée ?
je suis obligé de faire une vilaine boucle ?



"msnews.microsoft.com" a écrit dans le message
de news:
--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça


--voici le bout de code pour illustrer


CREATE TABLE TEST (ID INT IDENTITY(1,1) PRIMARY KEY, CODE VARCHAR(50))

INSERT INTO test (code) VALUES ('100;1001')
INSERT INTO test (code) VALUES ('788')
INSERT INTO test (code) VALUES ('100;1001;888')
INSERT INTO test (code) VALUES ('150;178,188')
INSERT INTO test (code) VALUES ('100')


--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça

SELECT y.*
FROM ( SELECT ID, CODE
FROM test) AS Z
INNER JOIN
(SELECT z.ID, RESULT
FROM MASTER.dbo.mafunctionSplit(z.CODE,';')) Y
ON y.id = z.id


--pour avoir cela comme resultat

ID CODE
1 100
1 1001
2 788
3 100
3 1001
3 888
4 150
4 178
4 188
5 100





Avatar
Fred BROUARD
Salut,

J'ai publié une solution à ton problème dans mon article général sur la
CTE :
http://sqlpro.developpez.com/cours/sqlserver/cte-recursives/#LIX

A +


msnews.microsoft.com a écrit :
--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça


--voici le bout de code pour illustrer


CREATE TABLE TEST (ID INT IDENTITY(1,1) PRIMARY KEY, CODE VARCHAR(50))

INSERT INTO test (code) VALUES ('100;1001')
INSERT INTO test (code) VALUES ('788')
INSERT INTO test (code) VALUES ('100;1001;888')
INSERT INTO test (code) VALUES ('150;178,188')
INSERT INTO test (code) VALUES ('100')


--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça

SELECT y.*
FROM ( SELECT ID, CODE
FROM test) AS Z
INNER JOIN
(SELECT z.ID, RESULT
FROM MASTER.dbo.mafunctionSplit(z.CODE,';')) Y
ON y.id = z.id


--pour avoir cela comme resultat

ID CODE
1 100
1 1001
2 788
3 100
3 1001
3 888
4 150
4 178
4 188
5 100




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
msnews.microsoft.com
Patrice ,

je comprends un "peu" ce que tu veux dire, mais il existe aussi des
contraintes clients.
je reçois ce type de données j'essai juste de m'en sortir avec et d'eviter
des traitements lourds.

Mais dans une certaine logique, je ne trouve pas ça ridicule.
En gros cela correspond à l'attachement d'une personne à plusieurs
abonnements.

Ch.




"Patrice" <http://www.chez.com/scribe/> a écrit dans le message de
news:
A brûle pourpoint ma préférence personnelle serait plutôt de faire le
contraire cad travailler avec des données normalisées et mettre en forme
quand le besoin s'en fait sentir plutôt que d'avoir des données
dénormalisées et de devoir les remettre en forme à chaque fois que je veux
faire une requête...


--
Patrice

"msnews.microsoft.com" a écrit dans le message
de groupe de discussion :

Bonjour à tous,

je crois que j'ai pas été au point sur le copié collé.

mais du coup personne n'a une idée ?
je suis obligé de faire une vilaine boucle ?



"msnews.microsoft.com" a écrit dans le message
de news:
--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça


--voici le bout de code pour illustrer


CREATE TABLE TEST (ID INT IDENTITY(1,1) PRIMARY KEY, CODE VARCHAR(50))

INSERT INTO test (code) VALUES ('100;1001')
INSERT INTO test (code) VALUES ('788')
INSERT INTO test (code) VALUES ('100;1001;888')
INSERT INTO test (code) VALUES ('150;178,188')
INSERT INTO test (code) VALUES ('100')


--En gros j'ai une function de table dans laquelle j'envoie la valeur du
code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça

SELECT y.*
FROM ( SELECT ID, CODE
FROM test) AS Z
INNER JOIN
(SELECT z.ID, RESULT
FROM MASTER.dbo.mafunctionSplit(z.CODE,';')) Y
ON y.id = z.id


--pour avoir cela comme resultat

ID CODE
1 100
1 1001
2 788
3 100
3 1001
3 888
4 150
4 178
4 188
5 100








Avatar
Patrice
Pas ridicule, simplement pas facile. A mon avis, le fond du problème est que
tu dois appeler une fonction pour des valeurs différentes et récupérer
l'ensemble des lignes retournées par ces différents appels.

Tu as exploré la voie CTE suggérée par Fred ?

Bon courage.

--
Patrice


"msnews.microsoft.com" a écrit dans le message de
groupe de discussion :
Patrice ,

je comprends un "peu" ce que tu veux dire, mais il existe aussi des
contraintes clients.
je reçois ce type de données j'essai juste de m'en sortir avec et d'eviter
des traitements lourds.

Mais dans une certaine logique, je ne trouve pas ça ridicule.
En gros cela correspond à l'attachement d'une personne à plusieurs
abonnements.

Ch.




"Patrice" <http://www.chez.com/scribe/> a écrit dans le message de
news:
A brûle pourpoint ma préférence personnelle serait plutôt de faire le
contraire cad travailler avec des données normalisées et mettre en forme
quand le besoin s'en fait sentir plutôt que d'avoir des données
dénormalisées et de devoir les remettre en forme à chaque fois que je veux
faire une requête...


--
Patrice

"msnews.microsoft.com" a écrit dans le message
de groupe de discussion :

Bonjour à tous,

je crois que j'ai pas été au point sur le copié collé.

mais du coup personne n'a une idée ?
je suis obligé de faire une vilaine boucle ?



"msnews.microsoft.com" a écrit dans le
message de news:
--En gros j'ai une function de table dans laquelle j'envoie la valeur
du code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça


--voici le bout de code pour illustrer


CREATE TABLE TEST (ID INT IDENTITY(1,1) PRIMARY KEY, CODE VARCHAR(50))

INSERT INTO test (code) VALUES ('100;1001')
INSERT INTO test (code) VALUES ('788')
INSERT INTO test (code) VALUES ('100;1001;888')
INSERT INTO test (code) VALUES ('150;178,188')
INSERT INTO test (code) VALUES ('100')


--En gros j'ai une function de table dans laquelle j'envoie la valeur
du code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça

SELECT y.*
FROM ( SELECT ID, CODE
FROM test) AS Z
INNER JOIN
(SELECT z.ID, RESULT
FROM MASTER.dbo.mafunctionSplit(z.CODE,';')) Y
ON y.id = z.id


--pour avoir cela comme resultat

ID CODE
1 100
1 1001
2 788
3 100
3 1001
3 888
4 150
4 178
4 188
5 100











Avatar
msnews.microsoft.com
Slt Patrice,

oui j'ai fait une fonction de table, la contrainte c'est une boucle.
sur le principe ca tourne tres bien, mais cela me gene de faire ça, parce
que je pense qu'il y'a mieux.

Pour la soluce de fred ca marche, en tout les cas bravo encore à fred parce
que je n'aurais pas pensé a partir dans cette voie.

j'aimerais juste retoucher, la partie de decoupage via peut etre une
fonction dotnet plus efficace sur les chaines de caractere.
mais je peux creuser cette voie...



"Patrice" <http://www.chez.com/scribe/> a écrit dans le message de
news:
Pas ridicule, simplement pas facile. A mon avis, le fond du problème est
que tu dois appeler une fonction pour des valeurs différentes et récupérer
l'ensemble des lignes retournées par ces différents appels.

Tu as exploré la voie CTE suggérée par Fred ?

Bon courage.

--
Patrice


"msnews.microsoft.com" a écrit dans le message
de groupe de discussion :

Patrice ,

je comprends un "peu" ce que tu veux dire, mais il existe aussi des
contraintes clients.
je reçois ce type de données j'essai juste de m'en sortir avec et
d'eviter des traitements lourds.

Mais dans une certaine logique, je ne trouve pas ça ridicule.
En gros cela correspond à l'attachement d'une personne à plusieurs
abonnements.

Ch.




"Patrice" <http://www.chez.com/scribe/> a écrit dans le message de
news:
A brûle pourpoint ma préférence personnelle serait plutôt de faire le
contraire cad travailler avec des données normalisées et mettre en forme
quand le besoin s'en fait sentir plutôt que d'avoir des données
dénormalisées et de devoir les remettre en forme à chaque fois que je
veux faire une requête...


--
Patrice

"msnews.microsoft.com" a écrit dans le
message de groupe de discussion :

Bonjour à tous,

je crois que j'ai pas été au point sur le copié collé.

mais du coup personne n'a une idée ?
je suis obligé de faire une vilaine boucle ?



"msnews.microsoft.com" a écrit dans le
message de news:
--En gros j'ai une function de table dans laquelle j'envoie la valeur
du code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça


--voici le bout de code pour illustrer


CREATE TABLE TEST (ID INT IDENTITY(1,1) PRIMARY KEY, CODE VARCHAR(50))

INSERT INTO test (code) VALUES ('100;1001')
INSERT INTO test (code) VALUES ('788')
INSERT INTO test (code) VALUES ('100;1001;888')
INSERT INTO test (code) VALUES ('150;178,188')
INSERT INTO test (code) VALUES ('100')


--En gros j'ai une function de table dans laquelle j'envoie la valeur
du code et il me retourne autant de ligne que necessaire
--Seulement je suis obligé de faire une boucle
--comment pourrais je faire pour eviter la boucle et faire cela en une
sorte de select comme ça

SELECT y.*
FROM ( SELECT ID, CODE
FROM test) AS Z
INNER JOIN
(SELECT z.ID, RESULT
FROM MASTER.dbo.mafunctionSplit(z.CODE,';')) Y
ON y.id = z.id


--pour avoir cela comme resultat

ID CODE
1 100
1 1001
2 788
3 100
3 1001
3 888
4 150
4 178
4 188
5 100