[SQL SERVEUR] porbleme de concatenation

porbleme de concatenation [SQL SERVEUR] - SQL/NoSQL - Programmation

Marsh Posté le 04-03-2009 à 17:58:35    

Bonjour,
 
voici mon petit probleme (je vous le soumet apres 5h de google)
 
Format de ma table SQL SERVER 2000
 
ID_ARTICLE,NOM,FK_GENERIQUE
 
1,brouette,NULL
300,COUSSIN,NULL
301,COUSSIN ROUGE,300
302,COUSSIN VERT,300
303,COUSSIN GRIS,300
304,TAPIS,NULL
 
Id_article indentifiant unique (int)
nom (varchar)
Fk_generique (int)
 
J'ai besoin de lister toutes les declinaisons par article avec l'ex ci-dessus j'obtient :
300,301
300,302
300,303
 
Je sais donc que l'article 300 à les déclinaisons 301,302,303
 
J'ai deja un select qui me ramene les infos articles (nom,taille,prix etc...) si je rajouter un select id_article from article where fk_generique=id_article j'ai un message d'erreur m'indiquant que je ne peux pas mettre 2 selects dans la meme requete car le 2eme a ranemer plusieurs resultats (301,302,303)
j'ai donc essayé de concatener le tout
j'ai essayé de passer en TSQL
 

Code :
  1. DECLARE @declinaisons VARCHAR(1000)
  2. DECLARE @fk_generique VARCHAR(1000)
  3. SELECT
  4. @declinaisons = COALESCE(@declinaisons,'') + cast(id_article as varchar) + ',',
  5. @fk_generique=fk_generique
  6. FROM article
  7. WHERE (fk_generique IN ( SELECT fk_generique FROM article))
  8. select @declinaisons,@fk_generique

Ce code fonctionne parcontre il me raneme uniquement le resultat total et non article par article
J'ai le bon resultat si je rajoute un "and fk_generique=300" dans ma requete mais uniquement pour l'article 300.
Je voudrais faire une boucle pour optenir tous les resultats et rentrer le tout dans un table article_declinaison  
id_article,declinaisons
ex
300,[301,302,303]
Pour pouvoir faire une jointure avec la requete principale
 
Merki de votre aide.

Reply

Marsh Posté le 04-03-2009 à 17:58:35   

Reply

Marsh Posté le 05-03-2009 à 08:04:50    

"J'ai deja un select qui me ramene les infos articles (nom,taille,prix etc...) si je rajouter un select id_article from article where fk_generique=id_article j'ai un message d'erreur m'indiquant que je ne peux pas mettre 2 selects dans la meme requete car le 2eme a ranemer plusieurs resultats (301,302,303)  
"
=> Pourrais-tu donner la requête conduisant à cette erreur ?


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 09:48:21    

Re,
 

Code :
  1. SELECT     Article.id_article,
  2.                           (SELECT     id_article
  3.                             FROM          article
  4.                             WHERE      fk_generique = id_article) AS total
  5. FROM         Article INNER JOIN
  6.                       Article_categorie ON Article.id_article = Article_categorie.fk_article INNER JOIN
  7.                       Categorie ON Article_categorie.fk_categorie = Categorie.id_categorie INNER JOIN
  8.                       Categorie Categorie_1 ON Categorie.fk_parent = Categorie_1.id_categorie INNER JOIN
  9.                       Univers ON Categorie_1.fk_univers = Univers.id_univers


http://tof.canardpc.com/view/9b31fa53-c40d-4fed-841d-49941a6852d0
merci

Reply

Marsh Posté le 05-03-2009 à 09:57:39    

ça je comprends pas ce que ça te ramène comme infos  
 
SELECT     id_article
FROM          article
 WHERE      fk_generique = id_article
 
Normalement d'après ton exemple  
 
ID_ARTICLE,NOM,FK_GENERIQUE  
1,brouette,NULL  
300,COUSSIN,NULL  
301,COUSSIN ROUGE,300  
302,COUSSIN VERT,300  
303,COUSSIN GRIS,300  
304,TAPIS,NULL  
 
 
=> Rien !?


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 10:12:56    

Le problème est là justement :  
 
SELECT     id_article
FROM          article
WHERE      fk_generique = id_article) AS total
 
Ca te retourne combien de résultat, si tu en as plus d'un, c'est normal.
 

Reply

Marsh Posté le 05-03-2009 à 10:24:39    

C'est clair !
Mais je vois pas pour l'instant  
l'utilité de cette sous-requête ...


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 10:28:27    

l'utilité est que je dois lister mes articles dans un export XML
et je dois aussi indiquer quelles sont ses declinaisons
 
ex :
<products>
<product id='300'>
<name>Parasol</name>
<url>http://www.truc.com/parasols.html</producturl>
<image>http://www.truc.com/119/119271.jpg</image>
<price>95</price>
<stock>1</stock>
<declinaison>283,299,301,313</declinaison>
</product>

Reply

Marsh Posté le 05-03-2009 à 10:39:45    

Mais cette bête requête te donne les déclinaisons non ?
 
SELECT     fk_generique ,id_article  
FROM          article
INNER JOIN
                      Article_categorie ON Article.id_article = Article_categorie.fk_article INNER JOIN
                      Categorie ON Article_categorie.fk_categorie = Categorie.id_categorie INNER JOIN
                      Categorie Categorie_1 ON Categorie.fk_parent = Categorie_1.id_categorie INNER JOIN
                      Univers ON Categorie_1.fk_univers = Univers.id_univers
 WHERE      fk_generique = <Entrer Valeur>


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 10:52:10    

j'utilise un plateforme d'extraction XML
j'ai le "droit" qu'a une seule requete...
et ta requete va remaner qu'une seule declinaison par ligne

Reply

Marsh Posté le 05-03-2009 à 11:10:59    

Et pourquoi pas un truc comme ça :

Code :
  1. SELECT a.id_article, d.id_article
  2. FROM article a INNER JOIN article d ON a.id_article = d.fk_generique
  3. ORDER BY a.id_article


Bon, après, faut ajouter tout ce dont tu as besoin en plus !
 
NB: j'ai pas essayé la requête, mais ça devrait aller normalement, ou alors il faut sérieusement que je ressorte mes bouquins de SQL ! :P


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 05-03-2009 à 11:10:59   

Reply

Marsh Posté le 05-03-2009 à 11:29:28    

Okay ! je comprends mieux !!!
 
Dans ce cas il te faut ouvrir un curseur en TSQL
et faire une boucle en réinitialisant ton champ declinaisons
à chaque generique + insert dans une table temporaire  
C'est la syntaxe pour faire ça qui te pose pb ?


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 11:38:28    

Avant de lui proposer un curseur, attend de voir si ce que je lui propose est suffisant ! :o


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 05-03-2009 à 11:39:59    

bahh j'ai migré en TSQL  
cf  

Code :
  1. DECLARE @declinaisons VARCHAR(1000)
  2. DECLARE @fk_generique VARCHAR(1000)
  3. SELECT
  4. @declinaisons = COALESCE(@declinaisons,'') + cast(id_article as varchar) + ',',
  5. @fk_generique=fk_generique
  6. FROM article
  7. WHERE (fk_generique IN ( SELECT fk_generique FROM article))
  8. select @declinaisons,@fk_generique


Parcontre vu que j'y connais que dalle en TSQL cette "requete" ne me ramene q'une ligne, elle est correcte mais ne ramene pas tous les cas.
Elle me ramene toutes les declinaisons possible dans un seul champ,et l'identifiant du dernier produit avec une declinaison.
Parcontre si je precise where fk_generique=300, la j'ai le bon resultat, il faut donc que j'arrive à faire une "boucle"

Reply

Marsh Posté le 05-03-2009 à 11:41:39    

kao98 a écrit :

Avant de lui proposer un curseur, attend de voir si ce que je lui propose est suffisant ! :o


merci mais le contrainte c'est d'avoir une seule ligne :
id,nom,etc...,[decli1,decli2,etc....] je pense que c'est un probleme de curseur.

Reply

Marsh Posté le 05-03-2009 à 11:53:01    

Ecoute Kao98 on se connait pas, toi tu prends à gauche, moi
je prends à droite ... ya pas de bleme ...
 
Ici c'est un forum : Une personne a un pb,  
il y a des solutions qui sont données (selon niveau/connaissances) et le demandeur prend ce qui lui parait raisonnable ...  
 
 
 
 
 
 
 


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 11:59:53    

vttman2 a écrit :

Ecoute Kao98 on se connait pas, toi tu prends à gauche, moi
je prends à droite ... ya pas de bleme ...
 
Ici c'est un forum : Une personne a un pb,  
il y a des solutions qui sont données (selon niveau/connaissances) et le demandeur prend ce qui lui parait raisonnable ...  
 


Heu, y'avait un smiley dans mon post !
T'excite pas ! J'avais pas compris qu'il ne fallait qu'une ligne par article contenant toutes ses déclinaisons.
 
Pis, surtout, j'avais mis un smiley ! Faut pas t'énerver comme ça, c'était pas méchant mon post !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 05-03-2009 à 12:01:06    

mrmask a écrit :


merci mais le contrainte c'est d'avoir une seule ligne :
id,nom,etc...,[decli1,decli2,etc....] je pense que c'est un probleme de curseur.


C'est quoi cet outil ? Bizarre d'avoir des limitations comme celle-ci !
 
 
Edit : bon, ça fait un moment que je cherche, et ça ne semble pas possible. Le hic, c'est qu'on ne peut pas ajouter des colonnes à une table de façon "dynamique" ! Même avec une table temporaire ! La solution la plus proche, ce serait de concaténer tous les résultats dans une chaîne avec un séparateur (tab, ;, ...) et de mettre ça dans une seule colonne "déclinaisons". Mais M'étonnerait que ton outil s'en sorte par la suite.


Message édité par kao98 le 05-03-2009 à 12:04:30

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 05-03-2009 à 12:05:32    

Ok Kao98  
=>
N'en parlons plus ... désolé j'étais passé de 2 de tension à 3 ;-)
 
Allez retour au Pb de mrmask now ...


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 12:07:24    

mrmask a écrit :

bahh j'ai migré en TSQL  
cf  

Code :
  1. DECLARE @declinaisons VARCHAR(1000)
  2. DECLARE @fk_generique VARCHAR(1000)
  3. SELECT
  4. @declinaisons = COALESCE(@declinaisons,'') + cast(id_article as varchar) + ',',
  5. @fk_generique=fk_generique
  6. FROM article
  7. WHERE (fk_generique IN ( SELECT fk_generique FROM article))
  8. select @declinaisons,@fk_generique


Parcontre vu que j'y connais que dalle en TSQL cette "requete" ne me ramene q'une ligne, elle est correcte mais ne ramene pas tous les cas.
Elle me ramene toutes les declinaisons possible dans un seul champ,et l'identifiant du dernier produit avec une declinaison.
Parcontre si je precise where fk_generique=300, la j'ai le bon resultat, il faut donc que j'arrive à faire une "boucle"


 
C'est normal que ça te ramenne qu'une ligne, tu ne peux stocker qu'un résultat par variable.

Reply

Marsh Posté le 05-03-2009 à 12:19:29    

donc je pense que cette fonction est un debut de solution
j'avais meme penser à envouyer le resultat dans une table pour pouvoir faire une jointure avec la requete principale

Reply

Marsh Posté le 05-03-2009 à 14:10:53    

Donc reste plus qu'à faire un genre de TSQL
comme ça ...
=>
DECLARE my_cursor CURSOR FOR  
< Select ramenant tous les articles >
OPEN my_cursor
FETCH NEXT FROM my_cursor  
INTO @myarticle
 
WHILE @@FETCH_STATUS = 0
BEGIN
   < Ton sql recherchant les <> valeurs pour article générique >
   < insert dans table temporaire >
   FETCH NEXT FROM my_cursor  
    INTO @myarticle
END
CLOSE my_cursor
DEALLOCATE my_cursor
GO
 
 
Sinon le + élégant  à mon avis
=>
Faire une function qui selon ton code générique  
te renverra la liste d'article (adaptation de ton TSQL)
 
ce qui nous donnera au final  
=>
select id_article, my_function(id_article)
from  ....
et pas besoin de table temporaire ;-)
 


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 14:35:07    

vttman2 a écrit :


 
Sinon le + élégant  à mon avis
=>
Faire une function qui selon ton code générique  
te renverra la liste d'article (adaptation de ton TSQL)
 
ce qui nous donnera au final  
=>
select id_article, my_function(id_article)
from  ....
et pas besoin de table temporaire ;-)
 


+1 :jap:
C'est ce que j'étais en train d'essayer de faire pour proposer une solution.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 05-03-2009 à 14:43:45    

Bon maintenant c'est à mrmask de travailler ;-)


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 05-03-2009 à 14:49:05    

Merci pour votre aide
mais apparament je suis trop naze en TSQL je n'arrive pas à la faire fonctionner ce que vttman2 a proposé.
 
Je vais essayer de faire un mix des deux et de faire une fonction :(


Message édité par mrmask le 05-03-2009 à 14:50:15
Reply

Marsh Posté le 21-03-2009 à 01:54:32    

mama mia! les curseurs sont à exclure !!!

Reply

Marsh Posté le 21-03-2009 à 02:05:06    

est ce que cette requete te suffit?
 
 
 
-- Listing des declinaisons uniquement des peres possedant des fils
--
-- si on veut aussi voir des peres sans fils,  
-- alors remplacer "inner join" par "left outer join"
 
select PERE.ID_ARTICLE , FILS.ID_ARTICLE , FILS.*
from  TABLE_ARTICLE as FILS inner join  
 (
 select ID_ARTICLE  
 from TABLE_ARTICLE
 where FK_GENERIQUE is null
 ) as PERE
 on FILS.FK_GENERIQUE = PERE.ID_ARTICLE  
 
 
te manque t'il des champs?

Reply

Marsh Posté le 21-03-2009 à 02:06:16    

peux-tu poster la requete qui te donne ce message :
 
"j'ai un message d'erreur m'indiquant que je ne peux pas mettre 2 selects dans la meme requete car le 2eme a ranemer plusieurs resultats (301,302,303) "

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed