【问题标题】:Getting datatable filter lists in a single SQL在单个 SQL 中获取数据表过滤器列表
【发布时间】:2017-10-21 04:03:34
【问题描述】:

我有一个在表格中列出记录的页面。在表的标题中,我们有过滤器过滤掉所选值的记录。为了填充这些过滤器列表,我需要从数据库中获取不同的值。例如,当列出一家公司的员工时,让我们说我有姓名、年龄、薪水的过滤器,然后我有单独的查询,例如

select distinct name from employee where company = `fordwagen`

如何在单个 SQL 中获取姓名、年龄和薪水的所有三个列表,而不需要三个数据库调用?

【问题讨论】:

  • 你避免三个数据库调用的目的是什么?您要优化什么?
  • 网络、数据库会话、更简洁的代码等...
  • 一个人编写的 SQL 语句的数量与任何这些事情之间没有必然的联系。您希望我们花时间帮助您:您至少可以花一些时间来提出一个体面的问题。请说明您要达到的目标。
  • 1.我不想花时间通过为每个列表访问数据库来建立网络,实际上我有十个列表。
  • 2.即使我使用连接池,我也不想多次访问同一页面的数据库。

标签: sql oracle


【解决方案1】:
select name as filter_value, 'name_filter' as filter_type from employee group by name
union
select ages as filter_value, 'age_filter' as filter_type from employee group by ages
union
select salary as filter_value, 'salary_filter' as filter_type from employee group by salary

group by 将具有与 distinct 相同的效果,您可以使用任何一种语法。这将为您提供filter_valuefilter type 的列表。用正确的filter_type 填充每个过滤器列表。

希望我在这里得到了你要问的内容......如果我离开了,请评论

【讨论】:

  • 列别名不是文字,它们不带单引号。
  • 当你的意思是DISTINCT时不要使用GROUP BY。您不是在聚合,您只是在删除重复项。然后使用TO_CHAR 让查询返回相同的数据类型;否则你会得到ORA-01790: expression must have same datatype as corresponding expression
【解决方案2】:

会有那么多重复的名字吗?一家全是史密斯夫妇的公司?应该不会吧。

这么简单

select first_name, last_name, age, salary from employees;

要获取 1000 个员工记录,而不是 250 个名字、700 个姓氏、30 个年龄和 120 个薪水。然后循环浏览您应用中的记录,您就可以使用尽可能少的流量。

【讨论】:

  • 预计一次有 6000 多条记录,因此有几个“John Smith”是很有可能的。
  • 不过,我认为我的百分比应该不会太离谱。大约 70% 不同的姓氏,25% 不同的名字......好吧,算你自己看看 :-)
  • 哦,现在我明白了。是的,这看起来是一种非常有效的方法,特别是当我们有超过 10 万个项目要查询并多次从中获取不同的值时,我将为我的应用程序测试这个,因为不确定数据库不同的运算符是否是比我的循环快。
  • 这看起来是最有效的方法,它可以在许多不同的语言/平台中轻松实现,而无需向您的应用程序添加新的结构,如数据库缓存等。这会将调试转换为噩梦.
【解决方案3】:
  1. 我不想花时间为每个列表去数据库,实际上我有十多个列表。

无论您发出十个单独的调用还是一个组合的调用,网络流量(数据包的数量)都将大致相同。

  1. 即使我使用连接池,我也不想在同一页面上多次访问数据库。

好的。但这更多是您如何设计应用层的问题。

  1. 我需要为不同的数据库调用创建不同的方法,并且我不想在需求发生变化时在很多地方进行更改。

您似乎对“更简洁的代码”有不同寻常的理解。单一职责原则(SOLID 中的 S)是干净代码的基石。有十个方法,每个方法做一件事比一个方法做十件事要干净。

也许您需要的是缓存?如果过滤器的目标表变化相对缓慢,那么结果集缓存可能非常有效。 Oracle 在数据库和客户端都支持缓存 - 具有内置失效功能。 Find out more。即使您的目标表确实经常更改,您也可以维护更静态的过滤器表。

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2012-12-21
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多