eviter boucle, quelle soluce CTE ???

Le
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
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
msnews.microsoft.com
Le #17273361
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" 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


Patrice
Le #17273941
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" 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" 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





Fred BROUARD
Le #17289021
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 *************************
msnews.microsoft.com
Le #17327271
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" 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" 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" 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








Patrice
Le #17329591
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" 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" 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" 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" 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











msnews.microsoft.com
Le #17332811
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" 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" 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" 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" 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" 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














Publicité
Poster une réponse
Anonyme