|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mars 2005 Messages : 50 ![]() |
Bonjour,
Apparement il est possible de mettre plusieurs SELECT dans une requête en SQL, mais je me demande si c'est compatible avec le driver DB2. J'interroge une base AS400 avec iseries. Je fais deux UNION (cette partie marche), et souhaiterais grouper ces deux UNION (en faisant un select qui englobe les deux union), mais ca ne marche pas. Voici ma requête : SELECT champ01,champ02,champ03,champ04,champ05 FROM { SELECT champ01,champ02,champ03,SUM(champ04) AS champ04,SUM(champ05) AS champ05 FROM MABASE WHERE champ01 CONCAT champ02 CONCAT champ03 BETWEEN 'xxxxxxxx' AND 'xxxxxxxx' AND champ04=xxxxxx AND champ05='xx' GROUP BY champ01,champ02,champ03,champ04,champ05 UNION ALL SELECT champ01,champ02,champ03,SUM(champ04) AS champ04,SUM(champ05) AS champ05 FROM MABASE2 WHERE champ01 CONCAT champ02 CONCAT champ03 BETWEEN 'xxxxxxxx' AND 'xxxxxxxx' AND champ04=xxxxxx AND champ05='xx' GROUP BY champ01,champ02,champ03,champ04,champ05 } GROUP BY champ01,champ02,champ03,champ04,champ05 quelqu'un aurait-il une idée ? Merci d'avance. |
|
|
00
|
|
|
#2 | |||
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 098 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Essaie avec une expression de table commune. En voici un exemple à partir de ta requête :
Code :
Remarque En aérant un peu la requête comme je l'ai fait, ça la rend plus lisible et plus claire pour la corriger si besoin est. |
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : mars 2005 Messages : 50 ![]() |
Merci pour vos réponses.
Dans la solution de Luc, j'ai un message d'erreur m'indiquant qu'il y a un caractère invalide (je pense que c'est le "{"). Et si je le remplace par un "(" ca me donne le même message d'erreur qu'avec la solution de mercure. C'est à dire : "le mot UNION est mal placé". Par contre, quand j'utilise WITH sans UNION, ca fonction : WITH TEMP AS ( SELECT * FROM BASE1 ) SELECT * FROM TEMP Mais dès que je met un UNION ca ne marche plus : WITH TEMP AS ( SELECT * FROM BASE1 UNION ALL SELECT * FROM BASE2 ) SELECT * FROM TEMP le problème viendrait-il de ma version d'odbc (iseries) trop ancienne ? (Version 5 édition 3). Merci de votre aide. ;-) |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Tu parles d'ODBC. Est-ce une requête établie directement sur l'AS400, c'est à dire faite sous STRSQL, incluse dans un programme HLL, etc ou bien provient-elle d'un client PC ?
J'ai fait un exemple équivalent en V5R2 directement sous STRSQL avec UNION puis UNION ALL et ça marche nickel-chrome. |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : mars 2005 Messages : 50 ![]() |
J'execute ma requête depuis deux souces :
1) depuis le logiciel SquirelSQL (sous windows XP) qui se connecte en ODBC à l'AS400 via Iseries 2) Depuis du code PHP (apache+php5) qui se connect à l'AS400 via Iseries aussi (version 5.3) Et dans les deux cas j'ai le même message d'erreur. je te remercie pour tes testes, c'est sympa (c'est génial de voir que sur ta config ça marche) |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : novembre 2004 Messages : 1 298 ![]() |
Tu es donc dans un environnement Client-Serveur.
Puisque la requête avec UNION fonctionne sous DB2/400 en direct, tu pourrais la mettre dans une procédure stockée sur le serveur iSeries et récupérer le record set sur le client PHP ou SquirelSQL. Déjà que l'ODBC n'est pas la panacée en matière de perf, ce serait je pense plus performant de l'exécuter directo sur l'AS400. Qu'en dis-tu ? |
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : mars 2005 Messages : 50 ![]() |
Ca serait en effet la meilleur solution (c sur que c'est beaucoup plus lent en client-serveur). Mais je n'ai pas accès au developpement sous as400 (ni la connaissance). Je ne peux passer que par un couche supplémentaire qui est le php et le client iseries.
Je suis ne train de télécharger runtime version 8 et db2 client administration v8 pour voir si ces outils pourraient remplacer iseries client qui semble ne pas gérer se genre de requêt (mais je suis un peu septique). Sinon je suis bon pour utiliser la requête SQL que pour mes union, et ensuite faire mes group en php (en mettant tout dans des tableaux puis retraiter derrière ces tableau); mais c'est source d'erreur, et surtout c'est domage car en sql ca prend 2 lignes. Merci de votre aide en tout cas. Si vous avez d'autres idées je suis prenneur. ;-) |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com