现有一部门表department,该表有如下字段:
年份 部门id 部门级别 部门名称
2009 01000000 01 01000000名称
2009 01010000 02 01010000名称
2009 01020000 02 01020000名称
2009 01010001 03 01010001名称
部门id前两位不为0,后6位为0时 ,该部门级别为01
部门id前3,4位不为0,后4位为0时 ,该部门级别为02
部门id前后4位位不为0时 ,该部门级别为03
部门级别01,02,03 表示部门的层次,比如02从属于01,03从属于02….
先在要查出部门级别为02 和03 的所以记录,并且查出的部门名称要包括上级的名称在内,
例如:查出01020000时,它的名称查出来应为:“01000000名称01020000名称”
查出01010001时,它的名称查出来应为:“01000000名称01010000名称01010001名称”
现在数据库里有5千多条记录,要查出来再页面显示。在java程序里用SQL语句一次性查出来需要30秒左右的时间。现在想提高查询效率,不知道怎么优化下面的SQL语句,不知道可否利用索引,希望大家帮忙想想啊。~_~
SELECT
A.年份,
A.部门id,
A.部门级别,
CASE WHEN B.部门名称 IS NULL THEN '' ELSE B.部门名称 END ||
CASE WHEN C.部门名称 IS NULL THEN '' ELSE C.部门名称 END ||
CASE WHEN D.部门名称 IS NULL THEN '' ELSE D.部门名称 END AS 部门名称全称
FROM
department A
LEFT OUTER JOIN department B ON B.年份= A.年份AND B.部门级别 = '01' AND B.部门id = SUBSTR(A.部门id, 1, 2) || '000000'
LEFT OUTER JOIN department C ON C.年份 = A.年份 AND C.部门级别 = '02' AND C.部门id = SUBSTR(A.部门id, 1, 4) || '0000'
LEFT OUTER JOIN department D ON D.年份 = A.年份 AND D.部门级别 = '03' AND D.部门id = A.部门id
WHERE
(A.年份 = '2009' AND A.部门id NOT LIKE '%%000000') AND
CASE WHEN B.部门名称 IS NULL THEN '' ELSE B.部门名称 END ||
CASE WHEN C.部门名称 IS NULL THEN '' ELSE C.部门名称 END ||
CASE WHEN D.部门名称 IS NULL THEN '' ELSE D.部门名称 END LIKE '%'
ORDER BY
A.部门id ASC,
A.年份 DESC,
A.部门级别 ASC
------解决方案--------------------------------------------------------
这种表结构设计,很难使用索引了。