Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
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 24/01/2011, 15h28   #1
Invité de passage
 
Inscription : mars 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 2
Points : 1
Points : 1
Par défaut jointure et PassTrough

Bonjour à tous,
Je cherche à optimiser un traitement qui prend environ 2h (libname + SQL) par une solution passtrough, cependant j'ai une erreur de code car je fais une jointure avec un table en local hors je ne vois pas trop comment faire ma jointure.

Ci-joint le code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
libname LOC "G:\local";
libname SERV db2 user="XXX" password="YY" DATABASE='BMP1G' schema='GU_AGRC' READBUFF=1000;
 
/* Ajout des coordonnées*/
PROC SQL;
      CREATE TABLE LOC.Point2 AS
          SELECT  A.* ,
                  B.IDLOC ,
                  C.ADR_IDADR,
                  D.ADR_NUMRUE,
                  D.ADR_NOMRUE,
                  D.ADR_COMMUNE,
                  D.ADR_POSTAL,
          FROM LOC.POINT A /*table local*/
 
          LEFT JOIN serv.DWH_POINT B
                  ON A.POINT_ID=B.POINT_ID
 
          LEFT JOIN serv.DWH_LOCAL C
                  ON B.IDLOC=C.IDLOC
 
          LEFT JOIN serv.DWH_ADRESSE D
                  ON C.ADR_IDADR=D.ADR_IDADR
;
quit;
 
/*solution passtrough*/
proc sql ;
    connect TO DB2 (user="XXX" password="YY" DATABASE='BMP1G' schema='GU_AGRC' READBUFF=1000);
    CREATE TABLE LOC.Point2 AS 
		SELECT * FROM connection TO DB2 	(
 
		SELECT 	A.* , 
                  B.IDLOC ,
                  C.ADR_IDADR,
                  D.ADR_NUMRUE,
                  D.ADR_NOMRUE,
                  D.ADR_COMMUNE,
                  D.ADR_POSTAL,
 
 
		FROM LOC.POINT A /*erreur*/
 
		LEFT JOIN DWH_POINT B
				ON A.POINT_ID=B.POINT_ID
		LEFT JOIN DWH_LOCAL C
				ON B.LOC_IDLOC=C.LOC_IDLOC
		LEFT JOIN DWH_ADRESSE D
				ON C.ADR_IDADR=D.ADR_IDADR
											);
 disconnect FROM db2;
QUIT;
le msg d'erreur :
Code :
1
2
CLI DESCRIBE error: [IBM][CLI Driver][DB2/AIX64] SQL0204N Le nom "LOC.POINT" n'est pas défini.
        SQLSTATE=42704
Merci.
valery95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h43   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bonjour,
J'ai balayé ton code en diagonale, et je pense que ya une coquille
la virgule juste avant ton "FROM LOC.POINT" ne devait pas y être.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
proc sql ;
connect to DB2 (user="XXX" password="YY" database='BMP1G' schema='GU_AGRC' READBUFF=1000);
create table LOC.Point2 as 
select * from connection to DB2 (

SELECT A.* , 
B.IDLOC ,
C.ADR_IDADR,
D.ADR_NUMRUE,
D.ADR_NOMRUE,
D.ADR_COMMUNE,
D.ADR_POSTAL,

FROM LOC.POINT A /*erreur*/LEFT JOIN DWH_POINT B
ON A.POINT_ID=B.POINT_ID
LEFT JOIN DWH_LOCAL C
ON B.LOC_IDLOC=C.LOC_IDLOC
LEFT JOIN DWH_ADRESSE D
ON C.ADR_IDADR=D.ADR_IDADR
);
disconnect from db2;
QUIT;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 16h01   #3
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Effectivement, comme le signale Brice, il y a une virgule en trop.
Mais le fond du souci, c'est que DB2 ne connaît pas ta table locale, effectivement. Ce qui veut dire que 1) tu connais suffisamment bien ton DBA pour obtenir d'avoir un espace où copier ta table locale dans la base DB2, et ensuite tu pourras faire ta jointure en pass-thru ; ou 2) tu fais toutes les jointures possibles en pass-thru et tu finis sous SAS :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
proc sql ;
    connect TO DB2 (user="XXX" password="YY" DATABASE='BMP1G' schema='GU_AGRC' READBUFF=1000);
    CREATE TABLE LOC.Point2 AS 
		SELECT * FROM 
LOC.POINT AS A
LEFT JOIN
connection TO DB2 	(
 
		SELECT  
                  B.IDLOC ,
                  C.ADR_IDADR,
                  D.ADR_NUMRUE,
                  D.ADR_NOMRUE,
                  D.ADR_COMMUNE,
                  D.ADR_POSTAL
 
 
		FROM  
                   DWH_POINT B
 
		LEFT JOIN DWH_LOCAL C
				ON B.LOC_IDLOC=C.LOC_IDLOC
		LEFT JOIN DWH_ADRESSE D
				ON C.ADR_IDADR=D.ADR_IDADR
) AS B
ON A.POINT_ID=B.POINT_ID ;
 disconnect FROM db2;
QUIT;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2011, 16h20   #4
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Olivier a raison , ta base ne reconnait pas la table SAS, pour te convaincre,
ajoute sa à ta requêtte SQL;
Code :
1
2
3
 
 
%put &sqlxmsg;
  Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 19h11   #5
Invité de passage
 
Inscription : mars 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 2
Points : 1
Points : 1
Merci pour vos réponses ,

effectivement la 2ème solution d'Olivier fonctionne j'arrive a gagné 1h de traitement ! Juste une petite correction dans le code il manquait le schéma a indiqué pour les tables db2.

voici le code corrigé :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
proc sql ;
    connect TO DB2 (user="XXX" password="YY" DATABASE='BMP1G' schema='GU_AGRC' READBUFF=1000);
    CREATE TABLE LOC.Point2 AS 
		SELECT * FROM 
LOC.POINT AS A
LEFT JOIN
connection TO DB2 	(
 
		SELECT  
                  B.IDLOC ,
                  C.ADR_IDADR,
                  D.ADR_NUMRUE,
                  D.ADR_NOMRUE,
                  D.ADR_COMMUNE,
                  D.ADR_POSTAL
 
 
		FROM  
                   GU_AGRC.DWH_POINT B
 
		LEFT JOIN GU_AGRC.DWH_LOCAL C
				ON B.LOC_IDLOC=C.LOC_IDLOC
		LEFT JOIN GU_AGRC.DWH_ADRESSE D
				ON C.ADR_IDADR=D.ADR_IDADR
) AS B
ON A.POINT_ID=B.POINT_ID ;
 disconnect FROM db2;
QUIT;
Valéry
valery95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h12.


 
 
 
 
Partenaires

Hébergement Web