SQL查找具有重复电子邮件和出生日期的记录

时间:2014-04-14 10:47:00

标签: sql sql-server

我尝试编写查询以查找数据库中的任何重复记录。我想查找其他记录中已存在EmailAddress和DateofBirth(两列)的所有记录(不是计数)。

帐户tbl包含EmailAddress。

用户tbl包含DateOfBirth

加入AccountID

以下查询选择其他记录中存在EmailAddress的记录或另一条记录中存在DateOfBirth的记录,但我无法合并这两个条件。如果我到目前为止是正确的,那么'和'在第7行的行为更像是一个'或'在我的情况下..?

select a.AccountName, a.EmailAddress, u.DateOfBirth from Account as a
join [User] as u
on a.AccountID = u.AccountID
where a.EmailAddress in (
select EmailAddress from Account group by EmailAddress having count(*) > 1
)
and
       DateOfBirth in(
select DateOfBirth from [User] group by DateOfBirth having count(*) > 1
)
order by u.DateOfBirth, a.EmailAddress

例如,这可能会产生50条记录。如果我查看它们,我会找到5条匹配的EmailAddress记录,但只有4条记录具有相同的DateOfBirth。由于数据库中的另一条记录具有相同的DateOfBirth但不同的EmailAddress,显示第5条记录。

我只想找到同时拥有匹配电子邮件和dob的记录。

一如既往地感谢,请询问您是否需要进一步说明。

此致 JSON

2 个答案:

答案 0 :(得分:2)

使用您的方法,您可以使用exists

select a.AccountName, a.EmailAddress, u.DateOfBirth
from Account as a join
     [User] as u
     on a.AccountID = u.AccountID
where exists (select EmailAddress
              from Account a2 join
                   [User] u2
                   on a.AccountID = u.AccountID
              where a2.EmailAddress = a.EmailAddress and
                    u2.DateOfBirth = u.DateOfBirth
              group by EmailAddress
              having count(*) > 1
             )
order by u.DateOfBirth, a.EmailAddress;

更好的方法是使用窗口/分析函数:

select AccountName, EmailAddress, DateOfBirth
from (select a.AccountName, a.EmailAddress, u.DateOfBirth,
             count(*) over (partition by a.EmailAddress, u.DateOfBirth) as cnt
      from Account as a join
           [User] as u
           on a.AccountID = u.AccountID
     ) ua
where cnt > 1
order by DateOfBirth, EmailAddress;

答案 1 :(得分:0)

  1. 加入帐户ID上的两个表格。
  2. 通过电子邮件和日期分组
  3. 仅显示具有count(*) > 1的条目(使用HAVING表达式)。
  4. 在MySQL中(我目前没有可用的MS SQL服务器),可以通过以下方式完成:

    SELECT * FROM a JOIN b ON a.account = b.account
      GROUP BY email, birth
      HAVING count(*) > 1;
    

    我使用以下命令设置表格ab

    create table a (
      account int primary key auto_increment,
      email text
    );
    create table b (
      account int,
      birth date,
      constraint foreign key (account) references a (account)
    );
    
    insert into a (email) values ("email1"), ("email1"), ("email2"), ("email2");
    insert into b values (1, "2000-01-01"), (2, "2000-01-01"), (3, "2000-01-01"), (4, "2000-01-02");