我有2個數據庫具有相同的結構,但數據不同。這兩個都是SQL 2005.在2個獨立的數據庫中找到唯一匹配
我想找到哪個數據庫A中的人存在於數據庫B中。我最好的匹配機會是匹配FirstName和LastName。
我只是想帶回的列表:
DatabaseA.Person DatabaseB.Person
其中: 1.我想從DatabaseA所有記錄,即使沒有在數據庫匹配B. 2.我只想要來自DatabaseB的記錄,其中FirstName/LastName只匹配DatabaseB中的一條記錄。
我已經寫了一個查詢,我在那裏分組,但由於我需要查看比FirstName和LastName更多的數據,所以無法將其分組 - 它給了我許多重複項。我應該使用什麼樣的查詢?我需要使用遊標嗎?
這裏是我的查詢現在,哪種作品 - 除了我在DatabaseB中獲取重複結果以及我想知道關於數據庫B的所有結果是當FirstName/LastName與一個不同的記錄匹配並且沒有其他記錄時。我的目標是獲得一個我知道的人是2個數據庫中同一個人的列表,以便我可以構建員工之間部門代碼映射的字典列表。
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
這裏就是我想現在,但我在左邊得到重複:
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
爲了什麼數據庫?請包括版本。這聽起來像你想'INTERSECT' ... ... – 2010-08-05 18:53:50
還包括表結構和數據的例子,所以我們可以幫助你更容易 – 2010-08-05 18:55:48