SELECT f.* FROM COM_FUNC f
JOIN COM_FUNC_PRIV fp ON fp.FUNC_ID=f.ID
WHERE fp.USER_ID=:userID
UNION
SELECT f.* FROM COM_FUNC f
JOIN COM_FUNC_PRIV fp ON fp.FUNC_ID=f.ID
JOIN COM_ROLE_USER ru ON ru.ROLE_ID=fp.ROLE_ID
WHERE ru.USER_ID=:userID
UNION
SELECT f.* FROM COM_FUNC f
JOIN COM_FUNC_PRIV fp ON fp.FUNC_ID=f.ID
JOIN COM_DEPT_USER du ON du.DEPT_ID=fp.DEPT_ID
WHERE du.USER_ID=:userID
还有一种是
SELECT f.* FROM COM_FUNC f
JOIN COM_FUNC_PRIV fp1 ON fp1.FUNC_ID=f.ID
JOIN COM_FUNC_PRIV fp2 ON fp2.FUNC_ID=f.ID
JOIN COM_ROLE_USER ru ON ru.ROLE_ID=fp2.ROLE_ID
JOIN COM_FUNC_PRIV fp3 ON fp3.FUNC_ID=f.ID
JOIN COM_DEPT_USER du ON du.DEPT_ID=fp3.DEPT_ID
WHERE ru.USER_ID=:userID OR du.USER_ID=:userID
还有更好的办法吗?亲
------解决方案--------------------
1、把union可否改为union all
2、表的数据量是多少,相关字段是否都有建立索引
------解决方案--------------------
是否可以先union all 起来再去重复呢?
select *
from table
where rowid in (select max(rowid) from table group by col..)
------解决方案--------------------
不知道这样管用不
SELECT f.* FROM COM_FUNC f
WHERE EXISTS(SELECT 1 FROM COM_FUNC_PRIV fp1 WHERE fp1.FUNC_ID=f.ID AND fp1.USER_ID=:userID)
OR EXISTS(SELECT 1 FROM COM_FUNC_PRIV fp2 JOIN COM_ROLE_USER ru ON ru.ROLE_ID=fp2.ROLE_ID WHERE fp2.FUNC_ID=f.ID AND ru.USER_ID=:userID)
OR EXISTS(SELECT 1 FROM COM_FUNC_PRIV fp3 JOIN COM_DEPT_USER du ON du.DEPT_ID=fp3.DEPT_ID WHERE fp3.FUNC_ID=f.ID AND du.USER_ID=:userID)
------解决方案--------------------
楼主,不大明白你的业务逻辑。
从你的第一个SQL来理解,两个union后的查询结果完全是第一部分的子集,这样Union起来只是多了一部分重复数据而已。最好能把你的业务逻辑解释一下,以便判断。
------解决方案--------------------
。。。我的意思是你需要得到什么样的数据