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.
为什么?
我的加入发生了怎样的事情?
好的,让我们制作一些示例数据;
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)
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |