2011-05-19 65 views
2

問:加入問題,有什麼最好的選擇?

我有5張或6張桌子,我從這些表需要的數據: 我提出以下連接語句來完成我的查詢。

SELECT d.batch_no,d.studytype_code,d.camp_code,d.dep_code,d.start_date,d.end_date,a.year,a.term_code,c.studytype_name ,e.dep_name_ar,f.camp_name_ar 
FROM llkbatch a , llkbatch_category b , mm19studytype c ,llkbatch_exception d ,llkdepartment e,llkcamp f 
WHERE a.batch_no = b.batch_no 
AND b.studytype_code = c.studytype_code 
AND b.batch_no = d.batch_no 
AND b.studytype_code = d.studytype_code 
AND d.dep_code = e.dep_code 
AND d.camp_code = f.camp_code 

,但我認爲join有時是性能較​​低的方式做這樣的事情,有沒有替代這在programming waydatabase layer,我的意思是一般要加入的替代品,當我應該去遠離連接。 非常感謝。

+0

是什麼讓你認爲'join' s爲壞的演出內容嗎? – Heinzi 2011-05-19 10:30:48

+0

你是否真的面臨任何性能問題?或者這就像「可能變得更慢」? – 2011-05-19 10:31:07

+0

不,但我的團隊負責人告訴我,這些連接是邪惡的,而且性能方式較差,並告訴我每次遇到類似case的情況時都應該找到替代方案。我使用informix dbms。 – 2011-05-19 10:33:08

回答

3

還有一個更現代的ANSI連接語法,這將使你的加入更具可讀性,但應該不會影響性能:

SELECT d.batch_no,d.studytype_code,d.camp_code,d.dep_code,d.start_date,d.end_date, 
     a.year,a.term_code,c.studytype_name ,e.dep_name_ar,f.camp_name_ar 
FROM ra1batch a 
JOIN ra1batch_category b ON a.batch_no = b.batch_no 
JOIN ra1studytype c ON b.studytype_code = c.studytype_code 
JOIN ra1batch_exception d ON b.batch_no = d.batch_no 
         AND b.studytype_code = d.studytype_code 
JOIN rr1department e ON d.dep_code = e.dep_code 
JOIN rr2camp f ON d.camp_code = f.camp_code 
+0

如果我使用存儲程序,而這會提高性能與否。 – 2011-05-19 10:43:33

+0

不,它不會。存儲過程仍然必須獲取並加入數據,或者通過運行相同的查詢或者(更糟糕的)運行幾個查詢並以編程方式組合結果。我建議你讓團隊負責人寫一本像「SQL for Dummies」這樣的書! – 2011-05-19 10:45:12

+1

你應該嘗試將其存儲到存儲過程,然後檢查性能..至少你會有一個基準,你需要改進 – V4Vendetta 2011-05-19 10:47:18

2

您在問題中編寫的查詢遵循Oracle的語法。但是,您使用連接就像使用SQL Server一樣。與您當前的查詢相比,它可以提供更好的性能。

與您當前的查詢相比,下面的查詢將解析得更快。

SELECT d.batch_no, d.studytype_code, d.camp_code, … 
FROM ra1batch a 
INNER JOIN ra1batch_category b on a.batch_no = b.batch_no 
+0

是的,我使用informix dbms – 2011-05-19 10:39:45

+1

它不是「Oracle語法」,它只是前綴ANSI JOIN語法。 Oracle已支持ANSI連接約15年。 – 2011-05-19 10:43:16

+1

我對Oracle不太瞭解。感謝您的澄清。 – 2011-05-19 10:50:40