有啥更好的方法? SQL select 是一一选择还是一起选择?

Posted

技术标签:

【中文标题】有啥更好的方法? SQL select 是一一选择还是一起选择?【英文标题】:What's better approach? SQL select for one by one or all together?有什么更好的方法? SQL select 是一一选择还是一起选择? 【发布时间】:2020-07-04 07:44:30 【问题描述】:

好吧,标题可能看起来令人困惑,但是 - 我需要根据每个用户的电子邮件从 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.FieldTable.Email 的值是多少?

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

因此,我收到的电子邮件将有尽可能多的选择。

感谢您的任何意见。

【问题讨论】:

不要向标签发送垃圾邮件。你为什么用python 这个应用程序是用python构建的,但没关系,我删除了它 无论查询长度如何,我都会尝试将 SQL 查询的数量最小化为 1,并尽可能尝试缓存。 【参考方案1】:

你的问题很难解析。

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

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 ?

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

【讨论】:

【参考方案2】:

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

其次,如果您单独查询每封电子邮件,您将面临为每封电子邮件返回多行的风险——除非您很好地构造了查询。在 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;

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

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

【讨论】:

【参考方案3】:

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

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

OR 只能在您过滤满足其中一个或多个列条件的值时使用。

【讨论】:

您的查询语法无效,您的声明不正确。 select * from T where C in(1, 2, 3) 在功能上与 select * from T where C = 1 or C = 2 or C = 3 相同 虽然提供了相同的结果,但是Sql标准对OR子句的污损方式是不正确的。当您想使用具有多个值的同一列进行过滤时,IN Cause 是正确的方法。对同一列使用OR 也会影响性能 没有。这是完全正确的,完全一样。 In gets compiled into or

以上是关于有啥更好的方法? SQL select 是一一选择还是一起选择?的主要内容,如果未能解决你的问题,请参考以下文章

SQL中选择列时括号有啥作用?

SQL 'select' 和 PL/SQL 'select' 语句有啥区别?

如何以原子方式运行 2 个 SQL“SELECT”?或者在我处理它们之前获取行数的任何其他更好的方法

有没有更好的方法来排序这个查询?

SQL中EXPLAIN

SQL - 如何从多个可能的列名中进行选择?