Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1558 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL SERVEUR] porbleme de concatenation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL SERVEUR] porbleme de concatenation

n°1857628
mrmask
Mask A Gaz
Posté le 04-03-2009 à 17:58:35  profilanswer
 

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.

mood
Publicité
Posté le 04-03-2009 à 17:58:35  profilanswer
 

n°1857813
vttman2
Je suis Open ...
Posté le 05-03-2009 à 08:04:50  profilanswer
 

"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 ...
n°1857833
mrmask
Mask A Gaz
Posté le 05-03-2009 à 09:48:21  profilanswer
 

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

n°1857841
vttman2
Je suis Open ...
Posté le 05-03-2009 à 09:57:39  profilanswer
 

ç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 ...
n°1857849
antac
..
Posté le 05-03-2009 à 10:12:56  profilanswer
 

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.
 

n°1857855
vttman2
Je suis Open ...
Posté le 05-03-2009 à 10:24:39  profilanswer
 

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 ...
n°1857857
mrmask
Mask A Gaz
Posté le 05-03-2009 à 10:28:27  profilanswer
 

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>

n°1857863
vttman2
Je suis Open ...
Posté le 05-03-2009 à 10:39:45  profilanswer
 

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 ...
n°1857874
mrmask
Mask A Gaz
Posté le 05-03-2009 à 10:52:10  profilanswer
 

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

n°1857882
kao98
...
Posté le 05-03-2009 à 11:10:59  profilanswer
 

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
mood
Publicité
Posté le 05-03-2009 à 11:10:59  profilanswer
 

n°1857896
vttman2
Je suis Open ...
Posté le 05-03-2009 à 11:29:28  profilanswer
 

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 ...
n°1857904
kao98
...
Posté le 05-03-2009 à 11:38:28  profilanswer
 

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
n°1857907
mrmask
Mask A Gaz
Posté le 05-03-2009 à 11:39:59  profilanswer
 

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"

n°1857909
mrmask
Mask A Gaz
Posté le 05-03-2009 à 11:41:39  profilanswer
 

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.

n°1857915
vttman2
Je suis Open ...
Posté le 05-03-2009 à 11:53:01  profilanswer
 

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 ...
n°1857920
kao98
...
Posté le 05-03-2009 à 11:59:53  profilanswer
 

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
n°1857921
kao98
...
Posté le 05-03-2009 à 12:01:06  profilanswer
 

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
n°1857924
vttman2
Je suis Open ...
Posté le 05-03-2009 à 12:05:32  profilanswer
 

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 ...
n°1857926
antac
..
Posté le 05-03-2009 à 12:07:24  profilanswer
 

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.

n°1857933
mrmask
Mask A Gaz
Posté le 05-03-2009 à 12:19:29  profilanswer
 

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

n°1857987
vttman2
Je suis Open ...
Posté le 05-03-2009 à 14:10:53  profilanswer
 

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 ...
n°1857999
kao98
...
Posté le 05-03-2009 à 14:35:07  profilanswer
 

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
n°1858000
vttman2
Je suis Open ...
Posté le 05-03-2009 à 14:43:45  profilanswer
 

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


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
n°1858006
mrmask
Mask A Gaz
Posté le 05-03-2009 à 14:49:05  profilanswer
 

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
n°1864276
akario
Posté le 21-03-2009 à 01:54:32  profilanswer
 

mama mia! les curseurs sont à exclure !!!

n°1864278
akario
Posté le 21-03-2009 à 02:05:06  profilanswer
 

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?

n°1864279
akario
Posté le 21-03-2009 à 02:06:16  profilanswer
 

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) "

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL SERVEUR] porbleme de concatenation

 

Sujets relatifs
Comment récupérer toute ma table SQL?[SQL] SELECT sur une table avec clé étrangère sur cette même table
#2003 le serveur ne répond pas "phpmyadmin'"Quoi choisir => Oracle ? MySQL ? Microsoft SQL ?
Copie de fichier vers autre serveurversion différente entre bibliothèque et serveur ?
[SSIS/SQL 2005] Utilisation de Tranasction dans un package[SQL Server 2005]Caractère unicode non sauvé dans la DB après 1 insert
Update SQL[SQL] SQL Server 2000 & la différence (not exists)
Plus de sujets relatifs à : [SQL SERVEUR] porbleme de concatenation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR