web-dev-qa-db-ja.com

古いSQL Serverの外部結合構文の変換

私はPower Builder(PB)開発者です。 PBを10.5から12.5に移行しましたが、ストアドプロシージャをSQL Server 2005から2012にも移行する必要があります。

Power Builderでプロシージャを実行すると、無効な式のエラーが発生します。以前は、2005年にデータベース互換性の低いモデルを使用していたため、手順をそこで使用できました。 =*は、右外部結合を記述する古い方法であることを学びました。

例えば:

select  *
from    A
right outer join
        B
on      A.bid = B.id

...古いスタイルで書かれています:

select  *
from    A,
        B
where   A.bid =* B.id

これは、*=を使用する私の手順の一部です。

SELECT  DISTINCT  
   a_stmt.cyc_dte,   
   a_carr.carr_nm,   
   a_stmt.amt_du_ic  
 FROM  a_stmt,   
   s_dataccs,   
   a_carr,  
   a_icc   
 WHERE ( a_stmt.ic_cntct_id *= a_icc.ic_cntct_id ) and  -- HERE
   ( a_icc.usg_ind = 'S' ) and   
   ( a_carr.acna = a_stmt.acna ) and     
   ( s_dataccs.acna = a_stmt.acna ) and ( s_dataccs.user_id = @user_id ) and   
   ( ( a_stmt.acna = @acna ) or ( @acna = '' ) ) AND    
   ( ( a_stmt.juris_id = @juris_id ) or ( @juris_id = '' ) ) AND    
   ( a_stmt.jrnl_mo_yr = @jrnl_mo_yr ) AND  
   ( a_stmt.amt_du_ic < 0 ) 

私はそれを次のように変換しました:

SELECT  DISTINCT  
   a_stmt.cyc_dte,   
   a_carr.carr_nm,   
   a_stmt.amt_du_ic  
from
 a_stmt left outer join a_icc on a_stmt.ic_cntct_id = a_icc.ic_cntct_id 
 join  a_carr on a_stmt.acna = a_carr.acna join s_dataccs on a_stmt.acna = s_dataccs.acna and
   ( a_icc.usg_ind = 'S' ) and   
   ( s_dataccs.user_id = @user_id ) and   
   ( ( a_stmt.acna = @acna ) or ( @acna = '' ) ) AND    
   ( ( a_stmt.juris_id = @juris_id ) or ( @juris_id = '' ) ) AND    
   ( a_stmt.jrnl_mo_yr = @jrnl_mo_yr ) AND  
   ( a_stmt.amt_du_ic < 0 )  

私のアプローチは正しいですか、それともWHERE条件を追加する必要がありますか?確認する本番データベースへのアクセス権がありません。開発データベースもSQL Server 2012にあります。古いバージョンを実行してチェックすることはできません。誰かがこれで私を助けてくれれば、本当に親切です!

2

私はすぐにあなたのクエリをつかんで、あなたがどのようにそれを書き直したかを見ずにそれを書き直しました。

SELECT  DISTINCT  
   a_stmt.cyc_dte,   
   a_carr.carr_nm,   
   a_stmt.amt_du_ic  
 FROM  a_stmt 
    LEFT OUTER JOIN a_icc on a_stmt.ic_cntct_id = a_icc.ic_cntct_id   
    INNER JOIN a_carr on a_carr.acna = a_stmt.acna
    INNER JOIN s_dataccs on s_dataccs.acna = a_stmt.acna
WHERE (a_icc.usg_ind = 'S') and
(s_dataccs.user_id = @user_id)  and   
( ( a_stmt.acna = @acna ) or ( @acna = '' ) ) AND    
( ( a_stmt.juris_id = @juris_id ) or ( @juris_id = '' ) ) AND    
( a_stmt.jrnl_mo_yr = @jrnl_mo_yr ) AND  
( a_stmt.amt_du_ic < 0 ) ;

あなたは私と同じ(または少なくとも基本的に)ものを持っているようですので、私はあなたが良いと言っています。あなたがそれをテストすることができれば当然ですが、私はそれが論理的に同じことであると安心します。

2
mskinner