2010-09-19 4 views
0

j'ai deux tables ont tous les deux colonnes de FNAME et lName comment pourrais-je écrire la requête pour vérifier et voir si l'une des tables manque un dossier qui ne marche pas exister dans l'autre table?comment vérifier deux tables de base de données pour les informations manquantes

voici les tables et ses colonnes

tbl_client 
-fname 
-lname 

tbl_lease 
-fname 
-lname 

je dois garder le contrôle de la tbl_lease pour voir si les enregistrements correspondent à la table tbl_client et si elle ne marche pas que je serais capable de l'afficher pour moi. grâce

Répondre

1

Une façon simple serait d'utiliser un prédicat not exists dans la clause where:

select tbl_client.fname, tbl_client.lname, 'missing from lease' as missingfrom 
    from tbl_client 
    where not exists 
     (select 1 from tbl_lease where tbl_lease.fname=tbl_client.fname 
     and tbl_lease.lname=tbl_client.lname) 
union 
select tbl_lease.fname, tbl_lease.lname, 'missing from client' as missingfrom 
    from tbl_lease 
    where not exists 
     (select 1 from tbl_client where tbl_lease.fname=tbl_client.fname 
     and tbl_lease.lname=tbl_client.lname) 

Ou peut-être faire une jointure externe complète et vérifier les enregistrements de la table sont nuls, mais c'est probablement un peu moins simple, et il pourrait être moins efficace qu'un not exists.

+0

Si vous n'avez pas d'index correspondant sur au moins l'un des noms dans les deux tables, vous pourriez rencontrer des scans de table qui pourraient être très lents dans tous les cas. Avec un index sur tbl_client (lname, fname) et un sur tbl_lease (lname, fname), la requête devrait être très rapide. – jbindel

+0

wow merci ne savait pas de celui-là. lors de l'utilisation existe pas est-il vérifier ce qui est dans la ne pas exister les parenthèses ou la sélection avant de ne pas exister –

+0

Il est vérifié que la sous-requête entre parenthèses renvoie aucun enregistrement. – jbindel

0

Obtenez tous les enregistrements tbl_lease où FNAME est pas présent dans tbl_client:

select tl.* from tbl_lease tl 
    left join tbl_client tc on tl.fname = tc.fname 
where tc.fname is null; 

Et l'inverse, les dossiers présents dans tbl_client où le FNAME est pas présent dans tbl_lease

select tc.* from tbl_client tc 
    left join tbl_lease tl on tc.fname = tl.fname 
    where tl.fname is null; 
Questions connexes