在表sc中有三列属性,sno,cno,grade,为什么SQL语句
select cno 
from sc scx
where cno not in
(select cno from sc where sno<>scx.sno);和
select cno 
from sc scx
where cno not in
(select cno from sc where sno<>sno);查询结果不同?

解决方案 »

  1.   

    第2个查询的SNO为SC表中的字段,第1个为别名SCX 表的SNO字段 ,
    第2个查询没有结果?
      

  2.   

    select cno  
    from sc scx
    where cno not in
    (select cno from sc where sno<>sno);第二个,这里 sno<>sno 永远是相等的,数据库会用当前表的两个字段比较,所以恒等,也就是说所有的记录都符合条件被返回。而 sno<>scx.sno 则指明是和外面的表scx进行比较。
      

  3.   

    有结果,结果不一样,别名scx是表示原表sc还是一个新的sc表的拷贝?
      

  4.   

    在比较的时候,sno是不是只和对应sno比较,而不是和sc表中每一行sno比较?对于sno<>scx.sno,具体又是怎么比较的呢?scx相当于一个新的单独表吗?
      

  5.   

    第二个是全部的结果,关键是第一个,这里应该没有连接操作,即“sno和sc表(拷贝)中每一行sno比较”
      

  6.   

    第一个sno在进行比较的时候,系统好像默认要cno等于sc表(拷贝)中cno,这是为什么呢?
      

  7.   

    select cno  
    from sc scx
    where cno not in
    (select cno from sc where sc.sno<>scx.sno);
    最好写子查询的时候,表名都带上,这样肯定不会有错,而且看起来也很容易理解。