porbleme de concatenation [SQL SERVEUR] - SQL/NoSQL - Programmation
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 ?
Marsh Posté le 05-03-2009 à 09:48:21
Re,
Code :
|
merci
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 !?
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.
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 ...
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>
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>
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
Marsh Posté le 05-03-2009 à 11:10:59
Et pourquoi pas un truc comme ça :
Code :
|
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 !
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 ?
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 !
Marsh Posté le 05-03-2009 à 11:39:59
bahh j'ai migré en TSQL
cf
Code :
|
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"
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 ! |
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.
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 ...
Marsh Posté le 05-03-2009 à 11:59:53
vttman2 a écrit : Ecoute Kao98 on se connait pas, toi tu prends à gauche, moi |
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 !
Marsh Posté le 05-03-2009 à 12:01:06
mrmask a écrit : |
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.
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 ...
Marsh Posté le 05-03-2009 à 12:07:24
mrmask a écrit : bahh j'ai migré en TSQL
|
C'est normal que ça te ramenne qu'une ligne, tu ne peux stocker qu'un résultat par variable.
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
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 ;-)
Marsh Posté le 05-03-2009 à 14:35:07
vttman2 a écrit : |
+1
C'est ce que j'étais en train d'essayer de faire pour proposer une solution.
Marsh Posté le 05-03-2009 à 14:43:45
Bon maintenant c'est à mrmask de travailler ;-)
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
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?
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) "
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
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.