[SQL] optimisation de requete.

RPG (3 et 4, free), CL, SQL, etc...
Répondre
germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

[SQL] optimisation de requete.

Message par germor »

Bonjour,

sous V7R1

Une table TABLE1 contient les colonnes CLE, ZONE, CHAMP, DATE, TEXTE et les données :
CLE1 ZONE1 CHAMP1 DATE1 TEXTE1
CLE2 ZONE1 CHAMP1 DATE2 TEXTE1
CLE3 ZONE1 CHAMP1 DATE3 TEXTE2
CLE4 ZONE1 CHAMP2 DATE4 TEXTE1
Je cherche à sélectionner les enregistrements de la table
pour 'ZONE1',
dont la date est inférieure à 'DATE4',
et dont le TEXTE est le même que celui de l'enregistrement de CLE4 ('TEXTE1')
et dont le CHAMP est différent de celui de l'enregistrement de CLE4 ('CHAMP2')

J'essaie :

Code : Tout sélectionner

SELECT * 
FROM TABLE1 R
WHERE R.ZONE = 'ZONE1'
AND R.DATE IN (SELECT RR.DATE FROM TABLE1 RR
				WHERE RR.ZONE = 'ZONE1'
				AND RR.DATE < 'DATE4'
				AND RR.CHAMP NOT IN &#40;SELECT RRR.CHAMP
								     FROM TABLE1 RRR
								     WHERE RRR.DATE = 'DATE4'
								     AND RRR.ZONE = 'ZONE1'&#41;&#41;
Auriez-vous plus simple ?
merci de vos réponses.

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

est-ce plus simple ?

Message par cmasse »

J'ai essayé de traduire littéralement.

Code : Tout sélectionner

select * from table1                                              
 where zone = 'ZONE1'  and date < 'DATE4'                         
       and texte = &#40;select texte from table1 where cle = 'CLE4'&#41;  
       and CHAMP <> &#40;select CHAMP from table1 where cle = 'CLE4'&#41; 
Christian Massé (Volubis.fr)

germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

(sans texte)

Message par germor »

Le cas fait que je cherche tous les enregistrements de la table
et la valeur 'CLE4' ne peut pas être précisée.
Par exemple, si TABLE1 contient :
CLE1 ZONE1 CHAMP1 DATE1 TEXTE1
CLE2 ZONE1 CHAMP1 DATE2 TEXTE1
CLE3 ZONE1 CHAMP1 DATE3 TEXTE2
CLE4 ZONE1 CHAMP2 DATE4 TEXTE1
CLE5 ZONE2 CHAMP5 DATE1 TEXTE1
CLE6 ZONE2 CHAMP5 DATE2 TEXTE1
CLE7 ZONE2 CHAMP6 DATE3 TEXTE2
CLE8 ZONE2 CHAMP5 DATE4 TEXTE1
je cherche toutes les ZONE pour lesquelles
la date est inférieure à 'DATE4',
et dont le TEXTE est le même que celui de l'enregistrement pour 'ZONE1' ayant une DATE4
et dont le CHAMP est différent de celui de l'enregistrement pour 'ZONE1' ayant une DATE4
et
et dont le TEXTE est le même que celui de l'enregistrement pour 'ZONE2' ayant une DATE4
et dont le CHAMP est différent de celui de l'enregistrement pour 'ZONE2' ayant une DATE4
et ainsi pour tous les enregistrements ZONE distincts.

ici je cherche à retourner :
CLE1 ZONE1 CHAMP1 DATE1 TEXTE1
CLE2 ZONE1 CHAMP1 DATE2 TEXTE1
CLE5 ZONE2 CHAMP5 DATE1 TEXTE1
CLE6 ZONE2 CHAMP5 DATE2 TEXTE1
et je tombe sur le code :
SQL0811 - Résultat de SELECT dépasse une ligne.
en simplifié, je cherche les ZONE de DATE antérieures ayant changé de CHAMP :wink:

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

clause EXISTS

Message par cmasse »

Alors je propose

Code : Tout sélectionner

select * from table1 T where date < 'DATE4'   
    and exists &#40;select * from table1          
                  where date = 'DATE4'        
                    and texte = T.texte       
                    and champ <> t.champ&#41;
Christian Massé (Volubis.fr)

germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

(sujet non précisé)

Message par germor »

merci, c'est exactement ce qu'il me fallait.

Répondre