用户表:users
用户权限表:user_power查询所有未被授过权的用户,以下是本人写的两条sql,不知道那种更好。
如果大家又更好的方法就贴出来把。:
SELECT *
FROM users
WHERE username
not in(
SELECT distinct username FROM user_power)SELECT u.*
FROM users u
WHERE NOT EXISTS (SELECT up.username FROM user_power up WHERE up.username=u.username)

解决方案 »

  1.   

    我记得SQL语句最好不要用in好像是说效率不高什么的。
      

  2.   

    第一种不好.如果数据达到10万多条的话不好做索引优化.速度不能达到最优.
    我们写sql最好避免在索引字段上使用not,<>,!=
    所以第二条要好于第一条.
      

  3.   

      19.       用NOT EXISTS替代NOT IN
     在子查询中,NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。  为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
     例如:
    SELECT …
    FROM EMP
    WHERE DEPT_NO NOT IN (SELECT DEPT_NO 
                             FROM DEPT 
                             WHERE DEPT_CAT=’A’);
     为了提高效率。改写为:
     (方法一: 高效)
    SELECT ….
    FROM EMP A,DEPT B
    WHERE A.DEPT_NO = B.DEPT(+)
    AND B.DEPT_NO IS NULL
    AND B.DEPT_CAT(+) = 'A’
     (方法二: 最高效)
    SELECT ….
    FROM EMP E
    WHERE NOT EXISTS (SELECT 'X’ 
                        FROM DEPT D
                        WHERE D.DEPT_NO = E.DEPT_NO
                        AND DEPT_CAT = 'A’);
      

  4.   

    not exists 比not in 要好
      

  5.   


    SELECT *
    FROM users 能不用*号最好就不要用星号,写清楚用哪个字段比较好.
      

  6.   

    http://blog.csdn.net/xuqing1980/archive/2007/04/28/1589059.aspxIN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
      

  7.   

    EXISTS 会使用索引,而 IN、DISTINCT 之类的不会使用索引,如果没索引的话,那也无所谓了。