Requête SQL sur table filtrée [Résolu]

Signaler
Messages postés
104
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
13 août 2020
-
Messages postés
104
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
13 août 2020
-
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

2 réponses

Messages postés
12
Date d'inscription
mercredi 12 août 2020
Statut
Membre
Dernière intervention
16 août 2020
1
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...

J'espère avoir répondu à votre question.

Cordialement,
Messages postés
104
Date d'inscription
mardi 13 novembre 2007
Statut
Membre
Dernière intervention
13 août 2020
2
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