有两张表,分别如下:
tab1: 
  
id     name
1       aa
2       bb
3       cc
4       dd
5       ee
------------------------
tab2:      name
      aa
      bb
      dd
----------------------------
第一种:select tab1.name from tab1
        inner join tab2 on(tab1.name=tab2.name)那么显示的是:
name
aa
bb
dd而第二种是把“=”改为“<>”,
        select tab1.name from tab1
        inner join tab2 on(tab1.name<>tab2.name)
照理说应该显示:
name
cc
ee但是为什么会显示一大串呢?

解决方案 »

  1.   

    先要知道2表连接的方式inner join 是用左表的每一条记录去跟右边表关联在第2个语句中
    比如aa 与bb 不同,与dd 也不同,所以结果应该有2个aa 
      

  2.   


    第二种为: select tab1.name from tab1
            where name not in (select name from tab2)
      

  3.   

    create table tab1(id int, name varchar(10))
    insert into tab1 values(1 , 'aa') 
    insert into tab1 values(2 , 'bb') 
    insert into tab1 values(3 , 'cc') 
    insert into tab1 values(4 , 'dd') 
    insert into tab1 values(5 , 'ee')
    create table tab2(name varchar(10))
    insert into tab2 values( 'aa') 
    insert into tab2 values( 'bb') 
    insert into tab2 values( 'dd') 
    go
    --1
    select tab1.name from tab1 inner join tab2 on tab1.name=tab2.name
    select tab1.name from tab1 , tab2 where tab1.name=tab2.name--2
    select tab1.name from tab1 where name not in (select name from tab2)
    select tab1.name from tab1 where not exists (select 1 from tab2 where name = tab1.name)drop table tab1 , tab2 /*
    name       
    ---------- 
    aa
    bb
    dd(所影响的行数为 3 行)name       
    ---------- 
    aa
    bb
    dd(所影响的行数为 3 行)name       
    ---------- 
    cc
    ee(所影响的行数为 2 行)name       
    ---------- 
    cc
    ee(所影响的行数为 2 行)
    */
      

  4.   

    ---------------------------------------------
    --> Author : jinjazzli
    --> Target : ---->1000
    --> Date   : 2009-12-11 10:25:29
    --> Version: SQL Server 2005
    ---------------------------------------------
        
    --> 测试数据: @tab1
    declare @tab1 table (id int,name varchar(2))
    insert into @tab1
    select 1,'aa' union all
    select 2,'bb' union all
    select 3,'cc' union all
    select 4,'dd' union all
    select 5,'ee' 
        
    --> 测试数据: @tab2
    declare @tab2 table (name varchar(2))
    insert into @tab2
    select 'aa' union all
    select 'bb' union all
    select 'dd'
     select a.name from @tab1 a
    where not exists(select * from @tab2 b 
    where a.name =b.name) 
     
    name
    ----
    cc
    ee(2 行受影响)第2种是这个
      

  5.   

    我的意思是,为什么select tab1.name from tab1 
            inner join tab2 on(tab1.name <>tab2.name) 
    查出来有好多?
      

  6.   

    你看看下面的--3,能看明白吗?你用的是<>,那tab1每个name都要和tab2的每个name比较.create table tab1(id int, name varchar(10))
    insert into tab1 values(1 , 'aa') 
    insert into tab1 values(2 , 'bb') 
    insert into tab1 values(3 , 'cc') 
    insert into tab1 values(4 , 'dd') 
    insert into tab1 values(5 , 'ee')
    create table tab2(name varchar(10))
    insert into tab2 values( 'aa') 
    insert into tab2 values( 'bb') 
    insert into tab2 values( 'dd') 
    go
    --1
    select tab1.name from tab1 inner join tab2 on tab1.name=tab2.name
    select tab1.name from tab1 , tab2 where tab1.name=tab2.name
    /*
    name       
    ---------- 
    aa
    bb
    dd(所影响的行数为 3 行)name       
    ---------- 
    aa
    bb
    dd(所影响的行数为 3 行)
    */--2
    select tab1.name from tab1 where name not in (select name from tab2)
    select tab1.name from tab1 where not exists (select 1 from tab2 where name = tab1.name)
    /*
    name       
    ---------- 
    cc
    ee(所影响的行数为 2 行)name       
    ---------- 
    cc
    ee(所影响的行数为 2 行)
    */--3
    select tab1.name , tab2.name from tab1 inner join tab2 on tab1.name<>tab2.name order by tab1.name
    /*
    name       name       
    ---------- ---------- 
    aa         bb
    aa         dd
    bb         dd
    bb         aa
    cc         aa
    cc         bb
    cc         dd
    dd         bb
    dd         aa
    ee         aa
    ee         bb
    ee         dd(所影响的行数为 12 行)
    */drop table tab1 , tab2 
      

  7.   

    select
     tab1.name 
    from 
      tab1 
    inner join tab2 on
      (tab1.name <>tab2.name)--楼主可以看看 取tab1表aa与tab2表相比  满足tab1.name <>tab2.name的是bb,cc,dd,ee
      接着取tab1表bb  满足tab1.name <>tab2.name 的是aa,cc,dd,ee
    ....
    一直执行到tabl1表的字段取完
      

  8.   


    楼主了解一个inner join方式,如3楼所说,就不难明白了
      

  9.   

    inner join是先做cross join(笛卡尔乘积),然后再根据条件进行筛选。
    你的条件是tab1.name <>tab2.name,那当然会有所谓的一大串了。