积极答复者
*=和left outer join的疑问

问题
-
最近在做sql 2000到sql 2008的升级测试,发现有些SQL语句不兼容,比如*=在sql 2008里就不认,因此把*=的写法都该成了用left outer join的写法,但是测试下来发现两者的结果不完全相同,有哪位知道原因么? 以下是改写前后的语句:
改写后:SELECT * FROM packingsliporder p left join artranshistory a
on p.packingslipid = a.relativeid
WHERE a.artransactiontype = 'I'
改写前:
SELECT * FROM packingsliporder p , artranshistory a
WHERE p.packingslipid *= a.relativeid
AND a.artransactiontype = 'I'
答案
-
这个是 外连接的传统写法和ANSI标准写法 的区别
--标准
select t1.*,t2.*
from table1 t1,table2 t2
where t1 left outer join t2 on (t1.id=t2.id)
--传统
select t1.*,t2.*
from table1 t1,table2 t2
where t1.id*=t2.id
--注意这个,如果超过一个表,where后面条件的循序会影响结果集。
--不过在2005后不支持,需要通过sp_dbcmptlevel修改兼容级别来完成这个查询。
family as water- 已标记为答案 中國風MVP, Moderator 2010年2月1日 1:40
-
在将*=/=*改写成 left join和right join时有什么规律吗? 如何才能确保改之前和改之后的结果集相同呢?
use [數據庫]
go
select
distinct 'exec sp_helptet '+quotename(b.Name)
from syscomments a
inner join sysobjects b on a.ID=b.ID
where (a.text like '%*=%' or like '%=*%') and b.Xtyp in('P','FN','IF','TF','TR','V')--存儲過程、函數、視圖
*= 改為left join ,把where 條件的放在left join 。。。后面
=*改為right join
參照MSDN SQL2000聯機幫助
ROY WU(吳熹 )- 已标记为答案 中國風MVP, Moderator 2010年2月1日 1:40
全部回复
-
这个是 外连接的传统写法和ANSI标准写法 的区别
--标准
select t1.*,t2.*
from table1 t1,table2 t2
where t1 left outer join t2 on (t1.id=t2.id)
--传统
select t1.*,t2.*
from table1 t1,table2 t2
where t1.id*=t2.id
--注意这个,如果超过一个表,where后面条件的循序会影响结果集。
--不过在2005后不支持,需要通过sp_dbcmptlevel修改兼容级别来完成这个查询。
family as water- 已标记为答案 中國風MVP, Moderator 2010年2月1日 1:40
-
在将*=/=*改写成 left join和right join时有什么规律吗? 如何才能确保改之前和改之后的结果集相同呢?
use [數據庫]
go
select
distinct 'exec sp_helptet '+quotename(b.Name)
from syscomments a
inner join sysobjects b on a.ID=b.ID
where (a.text like '%*=%' or like '%=*%') and b.Xtyp in('P','FN','IF','TF','TR','V')--存儲過程、函數、視圖
*= 改為left join ,把where 條件的放在left join 。。。后面
=*改為right join
參照MSDN SQL2000聯機幫助
ROY WU(吳熹 )- 已标记为答案 中國風MVP, Moderator 2010年2月1日 1:40