SQL avec ADOQUERY extraire un champ de table_1 qui n'est pas dans la table_2 [Résolu]

Signaler
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017
-
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017
-
Bonjour,

Malgré mes recherches je n'ai pas trouvré de réponse a la syntaxe SQL qui me permet de:

Dans la table_1 et la table_2 il y a le même champ "NOM"

1°Comment extraire les "NOM" de la table_1 qui ne sont pas dans la table_2 ?

Les exemples trouvé dans mes recherches ne fonctionnent pas .

2°est-ce dû à la version DELPHI où à une incompatibilité avec ADOQUERY ?


MERCI pour la réponse.


yvessimon

9 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
select t1.nom from table1 t1 where t1.nom not in (select t2.nom from table2 t2)
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Salut,
la méthode de Guillemouze est valable ,
SQL := 'SELECT Table1.Nom FROM Table1 WHERE Nom NOT IN (SELECT Table2.Nom FROM Table2)';

mais essaye celle-ci pour voir s'il y a une différence...
procedure ...
var
    CommandeSQL : string;
    I           : integer;
begin
    CommandeSQL := 'SELECT Table1.Nom FROM Table1';
    ...//Faire Execution SQL
    CommandeSQL := 'SELECT Table2.Nom FROM Table2 WHERE Nom NOT IN (';
    I := 0;
    while not ADOQuery.Eof do
    begin
        if I <> ADOQuery.RecordCount - 1 then
            CommandeSQL := CommandeSQL + QuoteStr(ADOQuery1.FieldByName('Nom').AsString)+','
        else
            CommandeSQL := CommandeSQL + QuoteStr(ADOQuery1.FieldByName('Nom').AsString)+')';
        Inc(I);
        ADOQuery1.Next;
    end;
    ...//Faire Execution SQL
end;

@+Yanb
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Oups
il y a une petite erreur dans le nom des tables il faut remplacer
    ...
    CommandeSQL := 'SELECT Table2.Nom FROM Table2';
    ...//Faire Execution SQL
    CommandeSQL := 'SELECT Table1.Nom FROM Table1 WHERE Nom NOT IN (';
    ...

Normalement dans le bonne ordre c'est mieux
@+Yanb
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
salut,
la nuit porte conseil
le code précédent marche pour des bases de petites tailles...
procedure ...
var
    I : integer;
begin
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT Table2.Nom FROM Table2');
    ...//Faire Execution SQL
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT Table1.Nom FROM Table1 WHERE Nom NOT IN (');
    I := 0;
    while not ADOQuery.Eof do
    begin
        if I <> ADOQuery.RecordCount - 1 then
            ADOQuery1.SQL.Add(QuoteStr(ADOQuery1.FieldByName('Nom').AsString)+',')
        else
            ADOQuery1.SQL.Add(QuoteStr(ADOQuery1.FieldByName('Nom').AsString)+')');
        Inc(I);
        ADOQuery1.Next;
    end;
    ...//Faire Execution SQL
end;

@+Yanb
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017

Bonjour,

Voici une solution SQL avec UNION ALL

UNION ALL regroupe 2 tables

je le fait 2 fois

dans la sélection j'ai table_1 + 2 x table_2

en dénombrant les éléments il est possible d'extraire seulement ceux qui sont dans la table_1 (ou la table_2)
si le compte = 1 --> table_1
si le compte = 2 --> table_2
si le compte = 3 --> table_1 et table_2

voici la ligne SQL

SELECT COUNT(expr1000) as Qt , expr1000 as nom_x FROM (
SELECT LCase(nom) FROM [nom_ref_1] UNION ALL SELECT LCase(nom) FROM [nom_ref_2] UNION ALL SELECT LCase(nom) FROM [nom_ref_2])
GROUP BY expr1000 ORDER BY COUNT(expr1000)


L'expression expr1000 vient de la 1ère sélection.

Mais cela ne m'explique pas pourquoi cela ne fonctionne pas avec JOIN ?

Question :
Quelle norme suit ADO et ADOQUERY ?

Merci

Salutations

yvessimon
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
Mais cela ne m'explique pas pourquoi cela ne fonctionne pas avec JOIN ?

Quel JOIN ? j'ai reparcouru tous les post, j'ai pas vu de JOIN !

Quelle norme suit ADO et ADOQUERY ?

je suis pas sur qu'ADO suive une norme, c'est plutot le Provider de ta DB qui intervient (que tu fournis dans la connectionstring, JET pour access)

Mais la question est plutot : "Ma solution ne te convient pas ? ", pourquoi tu te fais chier avec du comptage et du UNION ALL et des expr1000 qui font une requete interminable et illisible ?
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017

Bonjour,

Ta solution est parfaite.

Par contre je souhaite utiliser une ligne SQL afin de lancer la requette directement.


Merci pour ta participation

je faite des recherche sur le Provider

Salutations

yvessimon
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Salut,
En résumé tu veux juste la requête SQL donc celle de Guillemouze est parfaite
Par contre je viens de faire des tests pour être sur, une base de données avec 2 table de 10000 lignes et 10 colonnes...
Requête Guillemouze : 32.564 secondes
Requête Yanb : 9.324 secondes
Requête yvessimon : 78.562 secondes
Normes : Guillemouze à raison tout viens de la DB et du provider.
@+yanb
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017

Bonjour,

Merci pour de votre aide

en effet avec la bonne syntaxe
la Requête Guillemouze me convient parfaitement.

j'ai oublié les ()...

encore merci

yvessimon