2009-10-27 124 views
-1

是不是很好的代碼?可以簡化一下嗎?ms-access簡化SQL代碼

SELECT u.id,u.title,u.title,u.first,u.last FROM 
    (((tblusers u LEFT JOIN tbluserstudentteacher 
    ON u.id = tbluserstudentteacher.student_teacher_user_id) 
    LEFT JOIN tblUsersSubjects ON u.id = tblUsersSubjects.user_id) 
    LEFT JOIN tblUserAvailability ON u.id=tblUserAvailability.user_id) 
    LEFT JOIN chavrusas ON u.id=chavrusas.luser_id 
     WHERE 1=1 AND (u.gender) LIKE 'm*' 
     AND (chavrusas.luser_type)='shliach' 
     AND (chavrusas.ruser_type)='shliach' AND (u.last LIKE 'd*') 
GROUP BY u.id, u.title, u.title, u.first, u.last 
ORDER BY last; 
+1

lol @ where 1 = 1 – JonH 2009-10-27 18:59:06

+0

實際上這段代碼讓我想吐。誰寫它不知道什麼GROUP BY是或如何按照相關領域進行分組。 – JonH 2009-10-27 18:59:44

+2

保持在一個地方......這就像在20分鐘內你的第10個問題? – Fredou 2009-10-27 19:00:01

回答

1

從我對your other question的回答中,我也清理了它。看到這個帖子討論原因。

SELECT u.id, u.title, u.first, u.last 
    FROM (tblusers u LEFT JOIN chavrusas c ON u.id = c.luser_id 
    AND u.gender LIKE 'm*' 
    AND u.last LIKE 'd*' 
    AND c.luser_type = 'shliach' 
    AND c.ruser_type = c.luser_type) 
ORDER BY last; 
+0

肯感謝我的努力,看到沒有改善 – 2009-10-27 19:07:27

+0

沒有辦法沒有改善。你消除了三個連接;這本身應該已經顯示出一些改進(除非MySQL的優化器最近得到了很多改進,並且它正在消除它們,因爲您從未引用任何連接表的列)。 – 2009-10-27 19:33:37

3

你這樣做是錯誤的。看看已經提供的所有答案。

跳轉到代碼中。

根據需要進行更改以僅加載所需的數據,並且僅在需要時進行。

瞭解爲什麼分組可能會受傷,如果不需要,以及DISTINCTS如何提供幫助。

如何簡化查詢?

1

它看起來像從Access Query-Builder界面生成的東西。它可以被簡化,但我認爲你應該在修改代碼之前先理解代碼的使用方式和嘗試實現的內容。

另外,除非它消耗了大量的資源,否則你真的不想過早地開始優化。

1

Abrashka,有幾件事你可以看看,以優化上面的SQL代碼。如果可能的話,我會建議對所涉及表格的表格模式進行非規格化處理,以幫助減少正在執行的連接數量,以及擺脫那些不必要的組合條款。 LIKE語句也是性能命中,因此您可能需要重新考慮使用這些語句。

0

不看對我不好。一些建議:

  • 漂亮的格式化例如右對齊 查詢關鍵字以創建'管道' 並在新的 行上縮進ON子句。
  • 在 相關名稱前使用AS關鍵字。
  • 在整個SELECT子句中使用DISTINCT關鍵字而不是 分組(更好地表達意圖)。
  • 將連接的「過濾」謂詞移出 ,並移入WHERE子句。
  • 刪除parens。
  • 取出1=1謂詞和使用 參數PROCEDURE,而不是 動態SQL)

事情是這樣的:

SELECT DISTINCT u.id, u.title, u.first, u.last 
    FROM tblusers AS u 
     LEFT OUTER JOIN chavrusas AS c 
      ON u.id = c.luser_id 
      AND c.ruser_type = c.luser_type 
WHERE u.gender LIKE 'm*' 
     AND u.last LIKE 'd*' 
     AND c.luser_type = 'shliach' 
ORDER 
    BY last; 

另外也請查看SQL DDL。用戶是否具有「性別」(男性,女性,中性等)或性別(ISO 5218)?