我尝试编写查询以查找数据库中的任何重复记录。我想查找其他记录中已存在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
答案 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)
count(*) > 1
的条目(使用HAVING
表达式)。在MySQL中(我目前没有可用的MS SQL服务器),可以通过以下方式完成:
SELECT * FROM a JOIN b ON a.account = b.account
GROUP BY email, birth
HAVING count(*) > 1;
我使用以下命令设置表格a
和b
:
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");