SQL avec ADOQUERY extraire un champ de table_1 qui n'est pas dans la table_2

Résolu
yvessimon
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017
- 2 sept. 2010 à 14:24
yvessimon
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017
- 3 sept. 2010 à 14:07
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
A voir également:

9 réponses

Guillemouze
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
2 sept. 2010 à 17:25
select t1.nom from table1 t1 where t1.nom not in (select t2.nom from table2 t2)
3
cs_yanb
Messages postés
271
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
7 juillet 2022
13
2 sept. 2010 à 23:56
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
0
cs_yanb
Messages postés
271
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
7 juillet 2022
13
3 sept. 2010 à 00:06
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
0
cs_yanb
Messages postés
271
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
7 juillet 2022
13
3 sept. 2010 à 08:15
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yvessimon
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017

3 sept. 2010 à 11:09
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
0
Guillemouze
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
3 sept. 2010 à 11:48
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 ?
0
yvessimon
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017

3 sept. 2010 à 13:12
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
0
cs_yanb
Messages postés
271
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
7 juillet 2022
13
3 sept. 2010 à 13:50
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
0
yvessimon
Messages postés
637
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
9 janvier 2017

3 sept. 2010 à 14:07
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
0