有什么更好的方法?SQL逐个选择还是一起选择?



好吧,标题可能看起来令人困惑,但是 - 我需要根据每个用户的电子邮件从SQL数据库中选择一个字段。问题是 - 每个用户可能多次出现,所以简单的查询

Select Table.Field From Table Where Table.Email='email@email.com'

可能会返回此字段的多行(不要问我为什么,我没有设计系统(。 如果我收到多个Table.Email的请求,有什么更好的方法?

  1. 进行选择
Select Table.Field From Table
Where Table.Email='email@email.com'
or
Table.Email='email2@email.com'
or
Table.Email='email3@email.com'
or
...

然后遍历所有结果并控制每个Table.EmailTable.Field值是多少?

  1. 对于我收到的每封电子邮件执行
Select Table.Field From Table Where Table.Email=Email

因此,选择的数量与我收到的电子邮件一样多。

感谢您的任何意见。

你的问题很难解析。

例如,您说您可能会为"字段"(列(获得多行。但是,每一行的列值可以不同吗?如果是这样,如何确定您想要哪些值?

select table.email, max(table.column) from table where table.email in ('email1', 'email2', ...) group by table.email?
select table.email, min(table.column) from table where table.email in ('email1', 'email2', ...) group by table.email ?

您提出的解决方案都没有解决所述问题,如果您尝试做的是根据每个电子邮件参数为"字段"获取单个值。

通常,最好在数据库中而不是在应用程序中进行批量处理。 原因很简单:每个查询都有准备查询本身和返回结果的开销。 多个查询会使此开销成倍增加。

其次,如果单独查询每封电子邮件,则存在为每封电子邮件返回多行的风险 - 除非您很好地构建了查询。 在 SQL 本身中,您可以使用聚合、row_number()或类似机制将结果限制为每封电子邮件一个。 例如:

select email, field
from (select t.*, 
row_number() over (partition by email order by createdAt desc) as seqnum
from t
where email in (< emails you want here >)
) t
where seqnum = 1;

在某些情况下,您可能希望单独获取每封电子邮件。 例如,如果您在每一行上单独运行一个昂贵的操作(例如发送电子邮件(,那么交错操作可能是有意义的。 在这种情况下,"批量"查询具有更多的开销,因为它需要处理更多数据,因此通过查找单个电子邮件可以更快地获得第一个结果。

但是,一般规则是让数据库对数据执行尽可能多的工作,以适应数据库。

您必须使用IN子句来过滤多个值,

Select Table.Field From Table Where Table.Email in ('email@email.com' , 
'email2@email.com' , 'email3@email.com , ....)

仅当您筛选满足具有多个列或条件的值时,才能使用OR

最新更新