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

Messages postés
647
Date d'inscription
mardi 22 avril 2003
Dernière intervention
9 janvier 2017
- - Dernière réponse : yvessimon
Messages postés
647
Date d'inscription
mardi 22 avril 2003
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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
3
Merci
select t1.nom from table1 t1 where t1.nom not in (select t2.nom from table2 t2)

Merci Guillemouze 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
0
Merci
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
Commenter la réponse de cs_yanb
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
0
Merci
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
Commenter la réponse de cs_yanb
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
0
Merci
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
Commenter la réponse de cs_yanb
Messages postés
647
Date d'inscription
mardi 22 avril 2003
Dernière intervention
9 janvier 2017
0
Merci
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
Commenter la réponse de yvessimon
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
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 ?
Commenter la réponse de Guillemouze
Messages postés
647
Date d'inscription
mardi 22 avril 2003
Dernière intervention
9 janvier 2017
0
Merci
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
Commenter la réponse de yvessimon
Messages postés
260
Date d'inscription
lundi 27 octobre 2003
Dernière intervention
4 mars 2016
0
Merci
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
Commenter la réponse de cs_yanb
Messages postés
647
Date d'inscription
mardi 22 avril 2003
Dernière intervention
9 janvier 2017
0
Merci
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
Commenter la réponse de yvessimon

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.