2017-10-18 60 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。即使你的目標表經常改變,也許你可以維護更靜態的過濾器表。