pierrotk10d
Messages postés109Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention17 février 2023
-
Modifié le 9 avril 2020 à 22:49
pierrotk10d
Messages postés109Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention17 février 2023
-
13 août 2020 à 20:53
Bonjour,
Soit une table Zip.Db. Champs: Code, Ville, NumDep et la table Dep.Db: Champs NumDep, Departement, NumRegion. Je veux obtenir avec une requête SQL la liste des villes d'une région. Je filtre la table Dep.Db sur le champ NumRegion pour obtenir les départements de la région choisie.
J' exécute le Query suivant
With Query1 do begin
Close;
SQL.Clear;
UnPrepare;
SQL.ADD('SELECT * FROM Zip, Dep WHERE Zip.NumDep = Dep.NumDep');
Prepare;
Open;
end;
et j’obtiens un mauvais résultat (toutes les villes de la table Zip).
Je rempli une table temporaire DepTemp.Db ayant les mêmes champs que Dep.Db avec les départements de la région choisie. La requête suivante fonctionne correctement
SQL.ADD('SELECT * FROM Zip, DepTemp WHERE Zip.NumDep = DepTemp.NumDep');
Quelqu'un sait il pourquoi le requête SQL ne fonctionne pas sur la table filtrée?
Retour à Delphi 5 pour passer un peu de temps!
Cordialement
jacofee
Messages postés12Date d'inscriptionmercredi 12 août 2020StatutMembreDernière intervention16 août 20201 12 août 2020 à 17:38
Bonjour,
Le problème que vous rencontrez n'a rien à voir avec Delphi, mais beaucoup avec le fonctionnement des bases de données relationnelles (et donc le SQL puisque c'est le langage d'interrogation le plus répandu).
Votre première requête réalise ce que l'on appelle une jointure, fort correctement écrite par ailleurs.
SELECT * FROM Zip, Dep WHERE Zip.NumDep = Dep.NumDep
Vous obtiendrez le même résultat en la réécrivant selon la norme ANSI :
SELECT * FROM Zip INNER JOIN Dep ON Zip.NumDep = Dep.NumDep
Autrement dit, vous associez toutes les lignes de ZIP avec celles de Dep pour lesquelles les numéros de département correspondent. En quelque sorte les données des tables ZIP et Dep sont filtrées par le contenu des deux tables. C'est le sens de la clause INNER JOIN (qui désigne une jointure interne).
La deuxième requête fonctionne exactement de la même manière, mais comme la liste des départements est restreinte à celle que vous désirez, le résultat vous satisfait bien mieux.
Si vous voulez filtrer le résultat de la première requête selon une liste de départements, il vous faut y insérer une clause WHERE, comme dans cet exemple qui ne retient que lles Yvelines, le Territoire de Belfort et le Doubs :
SELECT * FROM Zip INNER JOIN Dep ON Zip.NumDep = Dep.NumDep WHERE Dep.NumDep IN (78,90,25)
Vous pouvez aussi filtrer selon tout critère qui vous arrange, comme le nom du département, la taille de sa population etc...
pierrotk10d
Messages postés109Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention17 février 20233 13 août 2020 à 20:53
Bonjour,
Merci de votre réponse. Pour résoudre le problème de filtrage j'ai utilisé une table temporaire. Je vais reprendre mon source et utiliser votre méthode.
Cordiales salutations