Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2007, 15h23   #1
Invité de passage
 
Inscription : mars 2005
Messages : 50
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 50
Points : 2
Points : 2
Par défaut DB2/AS400/iseries [plusieurs SELECT dans une requête]

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.
le_binr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 21h35   #2
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 098
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 098
Points : 1 707
Points : 1 707
Citation:
Envoyé par le_binr
... 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 ...
Manque un AS peut être ...
Code :
1
2
3
4
5
6
7
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
} AS TEMP
GROUP BY champ01,champ02,champ03,champ04,champ05
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2007, 14h39   #3
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Essaie avec une expression de table commune. En voici un exemple à partir de ta requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH CTE AS (
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  
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   )
SELECT champ01, champ02, champ03, champ04, champ05 FROM CTE
Il est inutile de répéter les colonnes sommées sur la clause GROUP BY.

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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 08h08   #4
Invité de passage
 
Inscription : mars 2005
Messages : 50
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 50
Points : 2
Points : 2
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.
;-)
le_binr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 15h10   #5
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 15h24   #6
Invité de passage
 
Inscription : mars 2005
Messages : 50
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 50
Points : 2
Points : 2
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)
le_binr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 16h08   #7
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 ?
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2007, 16h40   #8
Invité de passage
 
Inscription : mars 2005
Messages : 50
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 50
Points : 2
Points : 2
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.
;-)
le_binr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h56.


 
 
 
 
Partenaires

Hébergement Web