2009-10-27 79 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)?