有两张表,分别如下:
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但是为什么会显示一大串呢?
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但是为什么会显示一大串呢?
解决方案 »
- c#怎么连接数据库
- 怎么用DROP_EXISTING删除和重建索引“IX_PASSENGER_NAME”
- sql server 2005 错误:10060
- 遞歸查詢
- ASP连接SQL很慢!
- zqllyh(您问我也问总可以问出个所以然),pengdali(大力)和j9988(j9988) 请进,这900分特别酬谢 2
- SQL高手进
- 在SQL语句中,字段、表名都用变量带入(表和字段很多),做统计并且count,avg返回给变量,怎么做呀?!
- 欢迎高级人才加盟中国制造业猎头网,为你打造高薪平台
- 如果数据库里有8条结果集,我想先取3个,在取剩下的如何实现?
- 遇到一相当难的查询题如相,如何求得第3到6名的记录
- 请教大家一个问题:日期字段作为数据库表【主索引】的优化问题
比如aa 与bb 不同,与dd 也不同,所以结果应该有2个aa
第二种为: select tab1.name from tab1
where name not in (select name from tab2)
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 行)
*/
--> 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种是这个
inner join tab2 on(tab1.name <>tab2.name)
查出来有好多?
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
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表的字段取完
楼主了解一个inner join方式,如3楼所说,就不难明白了
你的条件是tab1.name <>tab2.name,那当然会有所谓的一大串了。