我接手的这个项目是一个C/S软件,服务器其实主要就是和数据库交互。可是在服务器代码里却发现有这样的SQL语句:
select a, b from t, (select max(uid) as c, d from t group by uid) e where t.uid=e.c and ...
一开始真是看不懂这种嵌套的查询语句,后来问了原开发人员才得知这是由于表 t中存在uid的重复记录,所以必须先选择一个最新的
记录集(select max(uid) ...),然后再在这个记录集上做查询。
便于理解的方式是分两步写,先:
select max(uid) as c, d from t group by uid
得到一个记录集,然后再在该记录集上做循环查询。当然这种方式可能没有前面直接交给数据库的方式效率来得高。
再深究一下,为什么会出现重复记录呢?一问才知原来是由于表 t中由于记录有时会有更新,而又不想删除原来的记录,
就是想保留历史记录,于是就创建了一条新的记录,造成了uid的重复。但这样就造成了在所有和这张表相关的查询都要
这样写这种复杂的嵌套语句,实际上是做了两次查询,降低了效率。
好的设计应当是创建一张新的历史记录表。在数据库设计和开发人员更新记录数时都可以发现这个问题并修改设计以
避免这种情况的出现。
规范化-数据库设计原则:
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0605jiangt/