Suite à de multiple tentatives de connexion de table avec des clauses plus ou moins variables entre Mapserver et PostgreSQL, j’ai trouvé différents problèmes et différentes manières de les régler.
Simple ou double cote ?!
Voici une requête classique :
the_geom FROM ( SELECT * FROM table1 ) AS foo USING UNIQUE ogc_fid USING SRID=27572
Cette requête est incluse dans des double cote :
DATA " ma requête "
Si vous avez enregistrez vos tables avec des nom contenant des caractères en majuscules ou des tirets, vous devez les modifier .
Astuce (à éviter pour les raisons qui vont suivre) : Pour que les tables soient reconnu, vous devez les inclure dans des double côtes :
the_geom FROM ( SELECT * FROM "TaBle-1" ) AS foo USING UNIQUE ogc_fid USING SRID=27572
Cette requête cette requête sera incluse dans des simple cote :
DATA ' ma requête '
Ce schéma se répète avec les noms de champ pour lors de jointures ou d’utilisation de clauses WHERE ou encore lors de la sélection de champs particuliers :
the_geom FROM ( SELECT * FROM table1 LEFT OUTER JOIN table2 ON (table1.id = table2.id) ) AS foo USING UNIQUE ogc_fid USING SRID=27572
Requête à inclure dans :
DATA " ma requête "
the_geom FROM ( SELECT * FROM "Table1" LEFT OUTER JOIN table2 ON ("Table1".id = table2."ID") ) AS foo USING UNIQUE ogc_fid USING SRID=27572
Requête à inclure dans :
DATA ' ma requête '
Le problème se compique lors de l’exécution d’une clause WHERE avec l’opérateur LIKE car si vous utilisez le caractère % ou _ , vous devrez les englober dans des simple cote. Donc, On abandonne obligatoirement les majuscule dans le nom des champs et dans le nom des tables.
Donc le résultat est
DATA "the_geom FROM ( SELECT * FROM table1 LEFT OUTER JOIN table2 ON (table1.id = table2.id) WHERE table1.id LIKE '29%' ) AS foo USING UNIQUE ogc_fid USING SRID=27572"
Les Jointures
J’ai remarqué que la jointure de deux tables dont le but est de renvoyer les éléments identique dans les deux tables peux s’écrire de deux voir trois manières.
Écriture 3 :
DATA "the_geom FROM ( SELECT * FROM table1 INNER JOIN table2 ON( table1.id = table2.id) ) AS foo USING UNIQUE ogc_fid USING SRID=27572"
Écriture 2 :
DATA "the_geom FROM ( SELECT * FROM table1,table2 WHERE table1.id = table2.id ) AS foo USING UNIQUE ogc_fid USING SRID=27572"
Dans cet Exemple, il n’y a pas de clause de jointure. Dans le cas une abscence de clauses JOIN c’est INNER JOIN qui est défini par défault si une clause WHERE avec un critère d’égalité est entrée sinon INNER JOIN se comporte comme CROSS JOIN (et donc comme un produit cartésien)
Écriture 3 :
DATA "the_geom FROM ( SELECT * FROM table1 NATURAL JOIN table2 ) AS foo USING UNIQUE ogc_fid USING SRID=27572"
Étant donné que la jointure des deux tables porte sur des champs identiques, il est possible de simplifier la requête en supprimant la clause WHERE ( avec une égalité de champs), USING, et ON.
Maintenant je ne sais pas si une de ces requêtes est plus rapide. Donc je vais tester ça.