查询表中唯一的一列,并返回所有列
table_name
-----------------
ID [PK]
Title
Last_Name
First_Name
Middle_Name
Suffix
Full_Address
Address1
Address2
City
State
Zip
County
Phone1
Phone2
Email
我有一个表与上述列名。我希望能够返回查询中“电子邮件”唯一的所有列和所有行。我如何用SQL来做到这一点?查询表中唯一的一列,并返回所有列
如果两行具有相同的电子邮件地址,那么我只想返回其中的一行。这并不重要。如果我可以合并那些很棒的行是没有必要的。
我正在使用LibreOffice Base,它是一个使用HSQL数据库引擎的.odb数据库。
我想只选择电子邮件不在表中复制的行。例如,我想通过电子邮件向数据库中的每个人发送电子邮件,但我知道很多人都在数据库中列出了两次,因为我已经合并了来自多个不同来源的数据。
我的主键是我刚才看到的ID列,我没有在上面列出。
如果您使用的是支持窗口功能的SQL引擎,那么你会怎么做:
select Title Last_Name, First_Name, Middle_Name, Suffix, Full_Address, Address1,
Address2, City, State, Zip, County, Phone1, Phone2, Email
from (select t.*, count(*) over (partition by email) as NumOnEmail
from t
) t
where NumOnEmail = 1
在任何数据库,你应该能够做到:
select Title Last_Name, First_Name, Middle_Name, Suffix, Full_Address, Address1,
Address2, City, State, Zip, County, Phone1, Phone2, Email
from t
where t.email in (select email from t group by email having count(*) = 1)
您的第二个查询可以正常工作,但它只返回约300行,我知道它应该返回超过10,000个唯一的电子邮件地址。 – 2012-07-28 23:06:35
你是什么意思的独特的电子邮件地址?此查询返回具有完全一个记录的电子邮件地址。 – 2012-07-29 01:40:14
您可以使用此解决方案每个电子邮件只能获得一行(无论是否有重复)。该行是基于ID
最大值为每封电子邮件:
SELECT b.*
FROM (SELECT MAX(ID) AS ID FROM table_name GROUP BY Phone1) a
JOIN table_name b ON a.ID = b.ID
该代码返回与上面的sql相同数量的记录309。您认为我的数据中存在一些问题?我有超过30000条记录应该会返回超过10000个独特的电子邮件。 – 2012-07-29 00:13:22
@ToddWelch,你能澄清一下:你是否只想选择电子邮件不在表中复制的行,或者你只是试图选择每行一行,而不管该电子邮件是否有其他重复项?还请解决我在问题评论中提出的问题:*您的主键列*是什么? – 2012-07-29 00:15:40
我试图只选择电子邮件不在表中复制的行。例如,我想通过电子邮件向数据库中的每个人发送电子邮件,但我知道很多人都在数据库中列出了两次,因为我已经合并了来自多个不同来源的数据。 我的主键是我刚才看到的ID列,我没有在上面列出。 – 2012-07-29 00:30:33
你能澄清你的问题有点:
对于电话号码?例如,如果两行具有相同的电子邮件地址,您是否只需要其中的一行,而您不关心哪一行?另外,请确认您使用的RDMS;一些数据库可能有不同的解决方案。只需编辑你的问题;不要在评论中回答。欢迎来到SO! – BellevueBob 2012-07-28 17:39:30
你正在使用什么类型的数据库? LibreOffice是基于数据库还是仅仅是访问另一个数据库(SQL Server,MySQL,Oracle等)的前端工具? – 2012-07-28 23:24:15
你的主键是什么列?你有一个自动递增的列或date_created列吗? – 2012-07-29 00:05:39