Question

Il y a deux tables: tables A et B. Ils ont les mêmes colonnes et les données sont pratiquement identiques . Ils ont tous deux ID incrémentée automatiquement, la seule différence entre les deux est qu'ils ont des ID différents pour les mêmes enregistrements.

Parmi les colonnes, il y a une colonne IDENTIFIER qui est pas unique , à savoir il y a des enregistrements (très peu) avec le même IDENTIFIER dans les deux tableaux.

Maintenant, afin de trouver une correspondance entre les ID de tableau A et les ID de tableau B, Je dois joindre ces deux tables (à toutes fins utiles, il est un autojointure) sur la colonne IDENTIFIER, quelque chose comme:

SELECT A.ID, B.ID
FROM A INNER JOIN B ON A.IDENTIFIER = B.IDENTIFIER

Mais, étant non unique IDENTIFIER, cela génère toutes les combinaisons possibles des valeurs répétées de IDENTIFIER, je ne veux pas.

Idéalement, je voudrais générer une association de une à une entre ID qui ont des valeurs de répétition IDENTIFIER , en fonction de leur ordre. Par exemple, en supposant qu'il y a six enregistrements avec différents ID et la même valeur IDENTIFIER dans le tableau A (et donc dans le tableau B):

A                                 B
IDENTIFIER:'ident105', ID:10  ->  IDENTIFIER:'ident105', ID:3
IDENTIFIER:'ident105', ID:20  ->  IDENTIFIER:'ident105', ID:400
IDENTIFIER:'ident105', ID:23  ->  IDENTIFIER:'ident105', ID:420
IDENTIFIER:'ident105', ID:100 ->  IDENTIFIER:'ident105', ID:512
IDENTIFIER:'ident105', ID:120 ->  IDENTIFIER:'ident105', ID:513
IDENTIFIER:'ident105', ID:300 ->  IDENTIFIER:'ident105', ID:798

Ce serait idéal. Quoi qu'il en soit, une façon de générer une à une association quel que soit l'ordre des ID serait toujours ok (mais pas préféré).

Merci pour votre temps,

Silvio

Était-ce utile?

La solution

select a_numbered.id, a_numbered.identifier, b_numbered.id from 
(
select a.*,
       case 
          when @identifier = a.identifier then @rownum := @rownum + 1
          else @rownum := 1
       end as rn,
       @identifier := a.identifier
  from a
  join (select @rownum := 0, @identifier := null) r
order by a.identifier

) a_numbered join (
select b.*,
       case 
          when @identifier = b.identifier then @rownum := @rownum + 1
          else @rownum := 1
       end as rn,
       @identifier := b.identifier
  from b
  join (select @rownum := 0, @identifier := null) r
order by b.identifier

) b_numbered 
on a_numbered.rn=b_numbered.rn and a_numbered.identifier=b_numbered.identifier
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top