none
*=和left outer join的疑问 RRS feed

  • 问题

  •    最近在做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'

     

    2010年1月28日 5:49

答案

  • 这个是 外连接的传统写法和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
    2010年1月28日 7:05
  • *=/=*是SQL2000兼容之前的舊版本語法
    這樣的連接在多表連接時存在問題,影響結果集。

    改為left join /right join
    ROY WU(吳熹)
    2010年1月28日 7:35
    版主
  •    在将*=/=*改写成 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(吳熹 )
    2010年1月28日 9:55
    版主

全部回复

  • 这个是 外连接的传统写法和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
    2010年1月28日 7:05
  • *=/=*是SQL2000兼容之前的舊版本語法
    這樣的連接在多表連接時存在問題,影響結果集。

    改為left join /right join
    ROY WU(吳熹)
    2010年1月28日 7:35
    版主
  •    在将*=/=*改写成 left join和right join时有什么规律吗? 如何才能确保改之前和改之后的结果集相同呢?
    2010年1月28日 9:35
  •    在将*=/=*改写成 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(吳熹 )
    2010年1月28日 9:55
    版主