J'ai 2 bases de données qui ont la même structure, mais des données différentes. Les deux sont SQL 2005.Recherche de correspondances uniques dans deux bases de données distinctes
J'essaie de trouver laquelle des personnes dans la base de données A, existe dans la base de données B. Ma meilleure occasion pour le match est de faire correspondre sur FirstName et LastName.
Je veux seulement ramener une liste de:
DatabaseA.Person DatabaseB.Person
Où: 1. Je veux que tous les enregistrements de DatabaseA, même s'il n'y a pas une correspondance dans la base de données B. 2. Je ne veux que des enregistrements de DatabaseB où FirstName/LastName correspondent à un seul enregistrement dans DatabaseB.
J'ai écrit une requête, où je grouper par, mais comme j'ai besoin de voir plus de données que FirstName et LastName, je ne peux pas le ramener sans le grouper - ce qui me donne beaucoup de doublons. Quel type de requête devrais-je utiliser? Ai-je besoin d'utiliser un curseur?
Voici ma requête maintenant, quel genre de travaux - sauf que je reçois des résultats pour les doublons dans DatabaseB et tout ce que je veux savoir sur la base de données B est lorsque FirstName/LastName correspond à un enregistrement distinct et aucun autre. Mon objectif est d'obtenir une liste de personnes que je connais sont la même personne dans 2 bases de données afin que je puisse construire une liste de dictionnaire de mappages de code de département entre les employés.
select
count(DatabaseAEmployee.id) as matchcount
, DatabaseAPerson.id as DatabaseAPersonid
, DatabaseAEmployee.DeptCode DatabaseADeptCode
, DatabaseAPerson.firstname as DatabaseAfirst
, DatabaseAPerson.lastname as DatabaseAlast
, DatabaseBPerson.id as DatabaseBPersonid
, DatabaseBEmployee.DeptCode as DatabaseBDeptCode
, DatabaseBPerson.firstname as DatabaseBfirst
, DatabaseBPerson.lastname as DatabaseBlast
, DatabaseAPerson.ssn as DatabaseAssn
, DatabaseBPerson.ssn as DatabaseBssn
, DatabaseAPerson.dateofbirth as DatabaseAdob
, DatabaseBPerson.dateofbirth as DatabaseBdob
FROM [DatabaseA].[dbo].Employee DatabaseAEmployee
LEFT OUTER JOIN [DatabaseA].[dbo].Person DatabaseAPerson
ON DatabaseAPerson.id = DatabaseAEmployee.id
LEFT OUTER JOIN [DatabaseB].[dbo].Person DatabaseBPerson
ON
DatabaseAPerson.firstname = DatabaseBPerson.firstname
AND
DatabaseAPerson.lastname = DatabaseBPerson.lastname
LEFT OUTER JOIN [DatabaseB].[dbo].Employee DatabaseBEmployee
on DatabaseBEmployee.id = DatabaseBPerson.id
group by
DatabaseAPerson.firstname
, DatabaseAPerson.lastname
, DatabaseAPerson.id
, DatabaseAEmployee.DeptCode
, DatabaseBPerson.id
, DatabaseBEmployee.DeptCode
, DatabaseBPerson.firstname
, DatabaseBPerson.lastname
, DatabaseBPerson.ssn
, DatabaseAPerson.ssn
, DatabaseBPerson.dateofbirth
, DatabaseAPerson.dateofbirth
Voici ce que je suis en train, mais je suis en train de doublons sur le côté gauche:
with UniqueMatchedPersons (Id, FirstName, LastName)
as (
select
p2.ID, p2.FirstName, p2.LastName
from
[DatabaseA].[dbo].[Employee] p1
INNER JOIN [DatabaseA].[dbo].[Person] p2 on p1.id = p2.id
inner join [DatabaseB].[dbo].[Person] p3
on p2.FirstName = p3.FirstName and p2.LastName = p3.LastName
INNER JOIN [DatabaseB].[dbo].[Employee] p4
on p3.id = p4.id
group by p2.ID, p2.FirstName, p2.LastName
having count(p2.ID) = 1
)
select p1.*, p2.*
from DatabaseA.dbo.Person p1
inner join UniqueMatchedPersons on p1.ID = UniqueMatchedPersons.ID
left outer join DatabaseB.dbo.Person p2
on p1.FirstName = p2.FirstName and p1.LastName = p2.LastName
Pour quelle base de données? S'il vous plaît inclure la version. Il semble que vous voulez 'INTERSECT' ... –
également inclure la structure de la table et l'exemple de données, afin que nous puissions vous aider plus facilement –