Cha*_*nce 1 sql-server duplication
我有一个表,其中有唯一的 ID、姓名、电子邮件和其他一些字段。我想将此表与电子邮件上的另一个表进行匹配,但有时电子邮件是共享的。唯一的ID不在表之间共享,但是当我识别它们时,我会将ID输入到另一个表中。名称并不唯一。
我想建立两轮连接。第一轮我想匹配电子邮件并附加 ID,第二轮将匹配 ID 并根据需要更新字段。
有没有办法查询表并仅获取那些具有唯一电子邮件的数据,而忽略那些共享电子邮件的数据?然后,我可以附加 ID 并重新查询那些没有 ID 的内容并加入名称。这还能用吗?
这是分区的一个很好的用途吗?我不太明白这些。
有没有办法查询表并仅获取那些具有唯一电子邮件的数据,而忽略那些共享电子邮件的数据?
我可以想出几种方法来做到这一点:
1)如果我重申这一点,我可能会说“获取表中只有 1 个条目的所有电子邮件地址,并排除表中具有多个条目的电子邮件地址。用于GROUP BY...HAVING识别非重复的电子邮件地址,分组通过地址,逐字查找COUNT1(或 > 1)中的 a:
--UNIQUE EMAILS
SELECT EmailAddress
FROM TableName
GROUP BY EmailAddress
HAVING COUNT(*) = 1;
---NON-UNIQUE EMAILS
SELECT EmailAddress
FROM TableName
GROUP BY EmailAddress
HAVING COUNT(*) > 1;
Run Code Online (Sandbox Code Playgroud)
这实际上会为您提供电子邮件地址列表,然后您需要使用该列表进行操作。
2)如果我以另一种方式重申你的问题,“获取所有不存在具有相同电子邮件地址的另一行的电子邮件。使用“EXISTS”和“NOT EXISTS”以及相关子查询来识别有或没有重复的行。
--UNIQUE EMAILS
SELECT t1.EmailId, t1.EmailAddress
FROM TableName t1
WHERE NOT EXISTS (SELECT 1 FROM TableName t2
WHERE t1.EMailId <> t2.EmailId AND t1.EmailAddress = t2.EmailAddress);
--NON-UNIQUE EMAILS
SELECT t1.EmailId, t1.EmailAddress
FROM TableName t1
WHERE EXISTS (SELECT 1 FROM TableName t2
WHERE t1.EMailId <> t2.EmailId AND t1.EmailAddress = t2.EmailAddress);
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我会选择第二种方法,因为我认为逻辑更容易遵循,并且我怀疑它会表现得更好(尽管这只是一个猜测)。