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

rfbsl7qr  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(471)

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

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

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

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.Field 对于每个 Table.Email ?
我收到的每封邮件

Select Table.Field From Table Where Table.Email=Email

所以我收到的邮件会有很多。
谢谢你的意见。

lvjbypge

lvjbypge1#

你的问题很难分析。
例如,您说过可能会为“field”(列)获取多行。但是,每一行的列值是否可以不同?如果是这样的话,你想如何决定你想要哪一个值?

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 ?

如果您尝试的是基于每个电子邮件参数为“字段”获取单个值,那么您提出的两个解决方案都不能解决上述问题。

t0ybt7op

t0ybt7op2#

一般来说,最好在数据库中进行批量处理,而不是在应用程序中。原因很简单:每个查询都有准备查询本身和返回结果的开销。多个查询会增加此开销。
第二,如果单独查询每封电子邮件,则可能会为每封电子邮件返回多行,除非查询结构良好。在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;

在某些情况下,您可能希望分别获取每封电子邮件。例如,如果您在每一行上分别运行一个昂贵的操作(例如发送电子邮件),那么将这些操作交错进行可能是有意义的。在这种情况下,“批量”查询的开销更大,因为它需要处理更多的数据,因此通过查找单个电子邮件,到达第一个结果的时间更快。
但是,一般的规则是让数据库对数据做尽可能多的工作。

qoefvg9y

qoefvg9y3#

你必须使用 IN 子句对多个值进行筛选,

Select Table.Field From Table Where Table.Email in ('email@email.com' , 
'email2@email.com' , 'email3@email.com , ....)
``` `OR` 仅当筛选满足或具有多个列的条件的值时才能使用。

相关问题