有什么更好的方法? SQL一一选择还是全部选择?

时间:2020-07-04 07:44:30

标签: sql sql-server select

好吧,标题看起来似乎很混乱,但是-我需要根据每个用户的电子邮件从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.Field的{​​{1}}值是什么?

  1. 我收到的每封电子邮件
Table.Email

因此,选择的内容将与我收到的电子邮件一样多。

谢谢您的输入。

3 个答案:

答案 0 :(得分:0)

您的问题很难解析。

例如,您说您可能会为“字段”(列)获得多行。但是,这些行中每一行的列值可以不同吗?如果是这样,该如何确定所需的值?

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 ?

如果您要执行的操作是根据每个电子邮件参数为“字段”获取单个值,那么您提出的解决方案都无法解决上述问题。

答案 1 :(得分:0)

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

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

OR仅在过滤满足多个条件之一或多个条件的值时可用。

答案 2 :(得分:0)

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

第二,如果分别查询每封电子邮件,则冒着为每封电子邮件返回多行的风险-除非结构合理。在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;

在某些情况下,您可能希望分别获取每封电子邮件。例如,如果您在每行上分别运行一项昂贵的操作(例如发送电子邮件),则可能需要交错操作。在这种情况下,“批量”查询需要处理更多的数据,因此会产生更多开销,因此通过查找一封电子邮件可以更快地获得第一个结果。

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