2017-10-18 68 views
1

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

select distinct name from employee where company = `fordwagen` 

我怎样才能得到所有三个列出了姓名,年龄和薪金一个SQL不会有三个数据库调用?

+1

你的目的是避免三次数据库调用?你想优化什么? – APC

+0

网络,数据库会话,更干净的代码等等...... – mCeviker

+0

在写入的数字SQL语句和其中的任何内容之间没有必要的连接。你希望我们花时间帮助你:至少你可以做的是投入一些时间来构建一个体面的问题。请解释你想达到的目标。 – APC

回答

1

会不会有很多重名?一个充满史密斯先生和夫人的公司?可能不会。

所以,简单地

select first_name, last_name, age, salary from employees; 

拿到,说1000条员工记录,而不是250个的名字,700个姓氏,30岁和120倍的工资。然后循环浏览应用中的记录,并尽可能减少流量。

+0

预计一次有超过6000条记录,因此拥有一对“John Smith”很有可能。 – mCeviker

+1

不过,我认为我的百分比不应该太过分。大约70%不同的姓氏,25%不同的名字......好吧,只需要亲眼看看:-) –

+0

哦,现在我明白了你的观点。是的,这看起来像是一种非常有效的方法,尤其是当我们有超过10万个项目来查询和获取不同的值时,我会测试这个为我的应用程序,因为不知道数据库不同运算符是比我的循环更快。 – mCeviker

2
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 

该组由by将具有相同的效果作为distinct,您可以使用任何语法。这使您作为filter_valuefilter type列表。通过正确的filter_type填充每个过滤器列表。

希望我有你在问什么在这里吧...如果我走了

+2

列别名不是文字,他们不采用单引号。 – APC

+1

当你的意思是“DISTINCT”时,不要使用“GROUP BY”。你不是聚合,你只是删除重复。然后使用'TO_CHAR'使查询返回相同的数据类型;否则你会得到'ORA-01790:表达式必须和对应的表达式具有相同的数据类型。 –

1
  1. 我不想花时间去通过数据库中的每个表联网评论,其实我有超过十个列表。

网络通信量 - 数据包的数量 - 将大体上相同,您是否发出十个单独的呼叫或一个组合调用。

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

好的。但更重要的是你如何设计你的应用程序层。

  • 我需要为不同的数据库调用不同的方法,我不希望让很多地方的变化在需求变更的情况。
  • 看来你有“干净的代码”不同寻常的理解。单一职责原则(该小号固体)是干净的代码的基石。有十种方法,每种方法做一件事比一件做十件事的方法更清洁。

    也许你需要的是一个高速缓存?如果过滤器的目标表格相对缓慢地变化,则结果集缓存可能非常有效。 Oracle支持数据库和客户端的缓存 - 内置失效 - 。 Find out more。即使你的目标表经常改变,也许你可以维护更静态的过滤器表。