有啥更好的方法? 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.Field
的Table.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 'select' 和 PL/SQL 'select' 语句有啥区别?