Sql 选择具有重复成员身份的重复人员

Sql 选择具有重复成员身份的重复人员,sql,sql-server,duplicates,Sql,Sql Server,Duplicates,使用schema和我最初的尝试 CREATE TABLE person ([firstname] varchar(10), [surname] varchar(10), [dob] date, [personid] int); INSERT INTO person ([firstname], [surname], [dob] ,[personid]) VALUES ('Alice', 'AA', '1/1/1990', 1), ('Alice', 'AA', '

使用schema和我最初的尝试

CREATE TABLE person
    ([firstname] varchar(10), [surname] varchar(10), [dob] date, [personid] int);

INSERT INTO person
    ([firstname], [surname], [dob] ,[personid])
VALUES
    ('Alice', 'AA', '1/1/1990', 1),
    ('Alice', 'AA', '1/1/1990', 2),
    ('Bob'  , 'BB', '1/1/1990', 3),
    ('Carol', 'CC', '1/1/1990', 4),
    ('Alice', 'AA', '1/1/1990', 5),
    ('Kate' , 'KK', '1/1/1990', 6),
    ('Kate' , 'KK', '1/1/1990', 7)

;

CREATE TABLE person_membership
    ([personid] int, [personstatus] varchar(1), [memberid] int);

INSERT INTO person_membership
    ([personid], [personstatus], [memberid])
VALUES
    (1, 'A', 10),
    (2, 'A', 20),
    (3, 'A', 30),
    (3, 'A', 40),
    (4, 'A', 50),
    (4, 'A', 60),
    (5, 'T', 70),
    (6, 'A', 80),
    (7, 'A', 90);

CREATE TABLE membership
    ([membershipid] int, [memstatus] varchar(1));

INSERT INTO membership
    ([membershipid], [memstatus])
VALUES
    (10, 'A'),
    (20, 'A'),
    (30, 'A'),
    (40, 'A'),
    (50, 'T'),
    (60, 'A'),
    (70, 'A'),
    (80, 'A'),
    (90, 'T');
有三张桌子(根据上面的小提琴)
Person
表包含重复项,同一个人输入了多次,在本练习中,我们假设名字、姓氏和DoB的组合足以唯一识别一个人

我正在尝试构建一个查询,该查询将显示重复的人(名字+姓氏+Dob),在
Person
表中有两个或多个活动条目(
Person\u membership.Person\u status=a
)和两个或多个活动成员身份(
membership.mestatus=a

使用SQLFiddle中的示例,查询的结果应该是Alice(两个活动人员ID,两个活动成员ID)。

我认为我在以下努力中取得了进展,但这看起来相当麻烦,我需要将Katie从最终结果中删除-她没有重复的会员资格

SELECT q.firstname, q.surname, q.dob, p1.personid, m.membershipid 
FROM
(SELECT
  p.firstname,p.surname,p.dob, count(*) as cnt
FROM
  person p
GROUP BY
  p.firstname,p.surname,p.dob
HAVING COUNT(1) > 1) as q
INNER JOIN person p1 ON q.firstname=p1.firstname AND q.surname=p1.surname AND q.dob=p1.dob
INNER JOIN person_membership pm ON p1.personid=pm.personid
INNER JOIN membership m ON pm.memberid = m.membershipid
WHERE pm.personstatus = 'A' AND m.memstatus = 'A'

您必须添加
Group by
Having
子句以仅返回重复的项目-

SELECT
  person.firstname,person.surname,person.dob
FROM
  person, person_membership, membership
WHERE
  person.personid=person_membership.personid AND person_membership.memberid = membership.membershipid
AND
  person_membership.personstatus = 'A' AND membership.memstatus = 'A'
GROUP BY
  person.firstname,person.surname,person.dob
HAVING COUNT(1) > 1

您必须添加
Group by
Having
子句以仅返回重复的项目-

SELECT
  person.firstname,person.surname,person.dob
FROM
  person, person_membership, membership
WHERE
  person.personid=person_membership.personid AND person_membership.memberid = membership.membershipid
AND
  person_membership.personstatus = 'A' AND membership.memstatus = 'A'
GROUP BY
  person.firstname,person.surname,person.dob
HAVING COUNT(1) > 1

由于您使用的是SQL Server windows函数,因此在这种情况下非常方便。下面将为您提供预期的输出

SELECT firstname,surname,dob,personid,memberid
from(
SELECT firstname,surname,dob,p.personid,memberid
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid) rnasc
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid desc) rndesc
FROM [StagingGRG].[dbo].[person] p
INNER JOIN person_membership pm ON p.personid=pm.personid
INNER JOIN membership m ON pm.memberid = m.membershipid
where personstatus='A' and memstatus='A')a
where a.rnasc+rndesc>2

由于您使用的是SQL Server windows函数,因此在这种情况下非常方便。下面将为您提供预期的输出

SELECT firstname,surname,dob,personid,memberid
from(
SELECT firstname,surname,dob,p.personid,memberid
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid) rnasc
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid desc) rndesc
FROM [StagingGRG].[dbo].[person] p
INNER JOIN person_membership pm ON p.personid=pm.personid
INNER JOIN membership m ON pm.memberid = m.membershipid
where personstatus='A' and memstatus='A')a
where a.rnasc+rndesc>2

始终最好使用ANSI连接语法。建议这样做。您的解决方案不显示Alice的person.personid、membership.membershipid信息,并且包含不应该在那里的Bob(他在person表中有一个条目),很遗憾,这不是我要找的。始终最好使用ANSI JOIN语法。建议这样做。您的解决方案没有显示Alice的person.personid、membershipid信息,并且包括不应该在那里的Bob(他在person表中只有一个条目),因此很遗憾,这不是我要查找的。对不起,您能发布预期输出吗?正如问题中所述-“查询的结果应该是Alice(两个活动的个人ID,两个活动的成员ID)。@MichalRosa所以基本上只有名称“Alice”"? 您在下面答案中的评论似乎表明您还需要某种形式的ID。我希望看到的输出与问题firstname、姓氏、dob、personid、memberidsorry中指定的完全相同,但您是否可以发布预期的输出?正如问题中所说—“查询的结果应该是Alice(两个活跃的个人ID,两个活跃的会员ID)。@MichalRosa所以基本上只有名字“Alice”?您在下面答案中的评论似乎表明您还需要某种形式的ID。我希望看到问题firstname、姓氏、dob、personid、MemberId中指定的输出。谢谢。需要修复几个拼写错误,我假设我需要做一个练习,看看我是否注意。非常聪明。五分钟后我已经了解了显示器的工作原理。我会将其保存为模板,以备将来与SQL的战斗。再次感谢。谢谢。需要修复几个拼写错误,我想我会留下来作为练习,看看我是否注意。非常聪明。在注视显示器五分钟后,我已经了解了它的工作原理。我会保存它将作为我未来与SQL作战的模板。再次感谢。