加入遗址选择

Mr.*_*ung 5 sql sql-server join

我有两张桌子,其中包含在公司工作的人员和他们的就业信息(所以人们是一张桌子,就业是另一张桌子).人员表包含有关人员居住地,紧急联系人,电话号码bla bla bla的信息.就业表包含他工作地点,最近老板等信息.这些表已被破坏,现在包含一些重复的错误.现在两个表中都有一个Person id,但就业ID仅位于Employment中.我希望所有被复制的人都有这两个数字.

这非常有效:

SELECT DISTINCT
    pp.Personid,
    pp.Firstname,
    pp.Lastname,
    pp.Address,
FROM People pp
JOIN People pp2
    ON pp.Firstname = pp2.Firstname
    AND pp.Lastname = pp2.Lastname
    AND pp.Address = pp2.Address
    AND pp.Personid <> pp2.Personid
ORDER BY pp.Firstname, pp.Lastname, pp.Personid
Run Code Online (Sandbox Code Playgroud)

返回以下值(但不包括就业号码,如您所见):

1001    Carl    Johnsson    Bigstreet 1
1002    Carl    Johnsson    Bigstreet 1
1003    Carl    Johnsson    Bigstreet 1
1010    Andrew  Wilkinsson  Smallstreet 2
1011    Andrew  Wilkinsson  Smallstreet 2
Run Code Online (Sandbox Code Playgroud)

现在,要添加就业ID,我就像这样加入该表:

SELECT DISTINCT
    pp.Personid,
    e.Employmentid,
    pp.Firstname,
    pp.Lastname,
    pp.Address,
FROM People pp
JOIN People pp2
    ON pp.Firstname = pp2.Firstname
    AND pp.Lastname = pp2.Lastname
    AND pp.Address = pp2.Address
    AND pp.Personid <> pp2.Personid
JOIN Employment e on pp.Personid = e.Personid
ORDER BY pp.Firstname, pp.Lastname, pp.Personid
Run Code Online (Sandbox Code Playgroud)

一切都在手提篮中进行,结果如下:

1001    1111    Carl    Johnsson    Bigstreet 1
1001    1111    Carl    Johnsson    Bigstreet 1
1001    1111    Carl    Johnsson    Bigstreet 1
1010    1234    Andrew  Wilkinsson  Smallstreet 2
1010    1234    Andrew  Wilkinsson  Smallstreet 2
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我得到了Personid和Employmentid,但现在我只得到其中一个(重复正确的次数),所以我的列表中没有所有不同的Personid和Employmentid.

为什么?

我的加入发生了怎样的事情?

Ric*_*ner 1

好的,让我们制作一些示例数据;

CREATE TABLE #People (PersonID int, FirstName varchar(50), LastName varchar(50), Address1 varchar(50))

INSERT INTO #People (PersonID, FirstName, LastName, Address1)
VALUES
('1','Mike','Hunt','Cockburn Crescent')
,('2','Mike','Hunt','Cockburn Crescent')
,('3','Mike','Hunt','Cockburn Crescent')
,('4','Connie','Lingus','Dyke Close')
,('5','Connie','Lingus','Dyke Close')
,('6','Eric','Shun','Tickle Avenue')
,('7','Ivana','Humpalot','Bottom Street')

CREATE TABLE #Employment (PersonID int, EmploymentID int)

INSERT INTO #Employment (PersonID, EmploymentID)
VALUES
('1','10')
,('2','11')
,('3','12')
,('4','13')
,('5','14')
,('6','15')
,('7','16')
Run Code Online (Sandbox Code Playgroud)

我会以不同的方式执行第一个查询,如果您在子选择中计算出重复项,则会更容易,然后您将能够毫无问题地加入就业表;

SELECT pp.PersonID
    ,em.EmploymentID
    ,pp.FirstName
    ,pp.LastName
    ,pp.Address1
FROM #People pp
JOIN (
    SELECT FirstName
        ,LastName
        ,Address1
        ,COUNT(1) records
    FROM #People
    GROUP BY FirstName
        ,LastName
        ,Address1
    HAVING COUNT(1) > 1
    ) pp2 ON pp.FirstName = pp2.FirstName
    AND pp.LastName = pp2.LastName
    AND pp.Address1 = pp2.Address1
LEFT JOIN #Employment em ON pp.PersonID = em.PersonID
Run Code Online (Sandbox Code Playgroud)

记得清理临时表;

DROP TABLE #People
DROP TABLE #Employment
Run Code Online (Sandbox Code Playgroud)