2014-07-15 4 views
-1

Je suis en train de comparer deux tables avec similaires mais pas exactes valeurs.Comparez deux champs de deux tables où les valeurs ne sont pas les correspondances exactes

Tableau 1 ressemble:

Group  ID  
G1  101939  
G1  181933    
G3  291940  

Tableau 2 ressemble

Group  ID  
G1  101939R 
G1  101939L 
G1  181933R 
G2  201943R 
G2  241947L 
G3  291940R 

Je voudrais revenir quelque chose comme ceci:

Group  ID  Match? 
G1  101939R Yes 
G1  101939L Yes 
G1  181933R Yes 
G2  201943R No 
G2  241947L No 
G3  291940R Yes 

Table Fondamentalement 2 a plus ID que tableau 1, et certains d'entre eux correspondent à tous sauf au dernier personnage.

+0

Pouvez-vous poster une requête que vous avez essayé ? – Jenn

+0

Les valeurs sont-elles uniques dans chaque table? Types de données? Fondamentalement, vos définitions de table devraient être dans la question ('\ d tbl' dans psql). Aussi, y a-t-il toujours 6 chiffres ou votre exemple est-il trompeur? Les groupes doivent-ils correspondre? Et qu'avez-vous essayé jusqu'ici? –

Répondre

2

Vous pouvez le faire avec une clause explicite join ou exists:

select t.*, 
     (case when exists (select 1 
          from table1 t1 
          where t1.group = t2.group and 
           t2.id like t1.id || '_' 
         ) 
     then 'Yes' else 'No' 
     end) as Matches 
from table2 t2; 

Si vous souhaitez autoriser correspondances exactes, ainsi que ceux qui manquent le dernier caractère, utilisez:

      where t1.group = t2.group and 
           (t2.id like t1.id || '_' or t2.id = t1.id) 
+0

C'était exactement ce dont j'avais besoin. Je vous remercie! – dhuss

0

Une autre option, si tous les groupes sont répertoriés dans table2 et les ID commencent par six nombres qui doivent être comparés:

SELECT t2."group", t2.id, t1.id IS NOT NULL 
FROM table2 t2 
LEFT JOIN table1 t1 ON (t1."group" = t2."group" AND t1.id = SUBSTRING(t2.id for 6)::INTEGER); 
0

Je suggère left(id, -1) comme plus simple et plus rapide pour couper le dernier caractère:

SELECT *, EXISTS (SELECT 1 FROM tbl1 WHERE t1.id = left(t2.id, -1)) AS match 
FROM tbl2 t2 

Rien dans votre question indique que les groupes doivent correspondre ...

Questions connexes