求一SQL语句
现有一部门表department,该表有如下字段:
年份 部门id 部门级别 部门名称
2009 01000000 01 01000000名称
200901010000 02 01010000名称
200901020000 02 01020000名称
200901010001 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
[解决办法]
这种表结构设计,很难使用索引了。