请教两条sql语句的不同.
语句一:
Select A.* From A Left Join B On A.Code = B.Code And B.Name = 'CSDN '
语句二:
Select A.* From A Left Join B On A.Code = B.Code Where B.Name = 'CSDN '
上面这两条语句的结果不相同,先求教大家错在哪里,为什么错?谢谢
[解决办法]
前者的 B.Name = 'CSDN ' 作用于 join 过程是否匹配的判断
后者的 B.Name = 'CSDN ' 作用于 join 结果集上的判断
两者已经是不同的处理过程了,结果不一样当然是很自然的事
[解决办法]
很大。
一是的件,一是查的件。
但是如果lEFT JOIN成INNER JOIN,效果就是一的了。
[解决办法]
关联的时候是默认ansi_nulls on 的 就是说 B.Name = 'CSDN ' 但B.Name 为null时是不成的
但ansi_nulls off 时 where 后面B.Name = 'CSDN ' 是成立的
没有举例,我说的对吗
[解决办法]
语句一:
Select A.* From A Left Join B On A.Code = B.Code And B.Name = 'CSDN '
在关联条件的时候判断,加了and 就是有不但而且,条件比一般苛刻!
语句二:
Select A.* From A Left Join B On A.Code = B.Code Where B.Name = 'CSDN '
sql语句执行完成返回结果集(临时表)后判断!
各位高手,各位牛人,帮回答个问题,如有相关资料请附了,谢谢!
http://community.csdn.net/Expert/topic/5696/5696608.xml?temp=.5177881
[解决办法]
第一句B.Name = 'CSDN '只是跟在left join 后面做关联条件,如果条件不匹配,left join 只会让右边为空,而不会去减少左边的记录数
第二句就完全不一样了B.Name = 'CSDN '跟在了where 后面,where 会无情地杀掉所有不合条件的记录,所以和第一句的结果就不一样了
[解决办法]
举个例子给你看就可以了
declare @A table(
code varchar(5),
name varchar(10)
)
declare @B table(
code varchar(5),
name varchar(10)
)
insert into @A select '001 ', 'aaa '
union all select '002 ', 'csdn '
union all select '003 ', 'ccc '
union all select '004 ', 'ddd '
insert into @B select '001 ', 'csdn '
union all select '002 ', 'aaa '
union all select '003 ', 'bbb '
--select * from @A
--select * from @B
select a.* from @A a
left join @B b on a.code=b.code and b.name= 'csdn '
select a.* from @A a
left join @B b on a.code=b.code
where b.name= 'csdn '
--结果(第一个)
001aaa
002csdn
003ccc
004ddd
(第二个)
001aaa
[解决办法]
关联的时候是默认ansi_nulls on 的 就是说 B.Name = 'CSDN ' 在关联时B.Name 为null时是不成的(不太肯定)
但ansi_nulls off 时 where 后面 B.Name 为null时 B.Name = 'CSDN ' 是成立的(其实不是成立就是返回Null时sql当 true来处理了)
手头还有工作,等下做测试
说明白了吧
------------------------------
我来测试:
create table #t1 (id1 int,col1 varchar(20))
insert into #t1
select 1, 'aaa1 ' union all
select 2, 'bbb1 ' union all
select 3, 'ccc1 ' union all
select 4, 'CSDN ' union all
select 5, 'CSDN '
create table #t2 (id2 int,col2 varchar(20))
insert into #t2
select 1, 'aaa2 ' union all
select 2, 'bbb2 ' union all
select 3, 'ccc2 ' union all
select 4, 'CSDN ' union all
select 5, null union all
select 6, null
create table #t3 (id3 int,col3 varchar(20))
insert into #t3
select 1, 'aaa2 ' union all
select 2, 'bbb2 ' union all
select 3, 'ccc2 ' union all
select 4, 'CSDN ' union all
select 5, 'ttt '
Select * From #t1 A Left Join #t2 B On A.id1 = B.id2 And B.col2 = 'CSDN '
/*
id1 col1 id2 col2
----------- -------------------- ----------- ---------
1 aaa1 NULL NULL
2 bbb1 NULL NULL
3 ccc1 NULL NULL
4 CSDN 4 CSDN
5 CSDN NULL NULL
*/
Select * From #t1 A Left Join #t2 B On A.id1 = B.id2 Where B.col2 = 'CSDN '
/*
id1 col1 id2 col2
----------- -------------------- ----------- --------
4 CSDN 4 CSDN
*/
Select * From #t1 A Left Join #t3 B On A.id1 = B.id3 And B.col3 = 'CSDN '
/*
id1 col1 id3 col3
----------- -------------------- ----------- --------
1 aaa1 NULL NULL
2 bbb1 NULL NULL
3 ccc1 NULL NULL
4 CSDN 4 CSDN
5 CSDN NULL NULL
*/
[解决办法]
sql语句的逻辑及顺序是这样的:
(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
[解决办法]
ls的不错,大概就是这个样子,先出结果集进行集合运算,再加条件过滤。
[解决办法]
:)
[解决办法]
前者and 是join的连接条件;后者where是join内部的子条件
[解决办法]
学习
[解决办法]
第一句B.Name = 'CSDN '只是跟在left join 后面做关联条件,如果条件不匹配,left join 只会让右边为空,而不会去减少左边的记录数
第二句就完全不一样了B.Name = 'CSDN '跟在了where 后面,where 会无情地杀掉所有不合条件的记录,所以和第一句的结果就不一样了
学习,鼎一下
[解决办法]
zsforever(虎虎) ( ) 信誉:100 2007-08-07 12:24:22 得分: 0
看来是我错了,搞反了哦,
希望不要误导大家,~~!
----------
:)
我是了,我都出你的情。
[解决办法]
学习
高手云集啊
[解决办法]
都说的那么明白了,路过.....