Bonsoir,
Ce n'était pas urgent, mais quand on est curieux...
Je ne suis pas sûr que dans la V547, la requête était la même, et je crois me souvenir, qu'on lui reprochait de trouver des doublons entre des villes françaises et belges qui ont le même code INSEE. C'est la raison pour laquelle il a été ajouté le contrôle de la différence du code Pays, et que pour faire bonne mesure, l'affichage du nom du pays a été ajouté.
La requête exécutée est la suivante:SELECT DISTINCT
A.CP_CODE,
A.CP_CP,
A.CP_VILLE,
A.CP_INSEE,
A.CP_LONGITUDE,
A.CP_LATITUDE,
P.RPA_LIBELLE
FROM
REF_CP_VILLE A,
REF_CP_VILLE B,
REF_PAYS P
WHERE
(A.CP_INSEE IS NOT NULL) AND
(A.CP_INSEE <>'') AND
(A.CP_INSEE = B.CP_INSEE) AND
(A.CP_CODE <> B.CP_CODE) AND
(B.CP_PAYS = A.CP_PAYS) AND
(P.RPA_CODE = A.CP_PAYS)
ORDER BY
A.CP_PAYS, A.CP_INSEE, A.CP_VILLE, A.CP_CP
Elle s'exécute en 3mn. Par contre en supprimant la jointure avec la table REF_PAYS (qui n'est là que pour afficher le nom du pays), il suffit de 0,5s!
Je propose de remplacer cette requête par la suivante:select
x.CP_CODE,
x.CP_CP,
x.CP_VILLE,
x.CP_INSEE,
x.CP_LONGITUDE,
x.CP_LATITUDE,
x.CP_PAYS,
P.RPA_LIBELLE
from
(SELECT DISTINCT
A.CP_CODE,
A.CP_CP,
A.CP_VILLE,
A.CP_INSEE,
A.CP_LONGITUDE,
A.CP_LATITUDE,
A.CP_PAYS
FROM
REF_CP_VILLE A,
REF_CP_VILLE B
WHERE
(A.CP_INSEE IS NOT NULL) AND
(A.CP_INSEE <>'') AND
(A.CP_INSEE = B.CP_INSEE) AND
(A.CP_CODE <> B.CP_CODE) AND
(B.CP_PAYS = A.CP_PAYS) ) X
inner join REF_PAYS P on P.RPA_CODE = x.CP_PAYS
ORDER BY
x.CP_PAYS, x.CP_INSEE, x.CP_VILLE, x.CP_CP
qui ne prend également que 0,5s. Au passage, çà illustre une des nouveautés de Firebird 2.0 que l'on appelle table dérivée. Une sous-requête (sans la jointure à REF_PAYS) remplace une table dans le WHERE. Ainsi la jointure n'est à faire que sur le résultat.
Mais çà ne marche pas avec FB1.5.
A+
André