2

いくつかのレガシー手続き型コードを移行しようとしています。同じ結果を生成するための ANSI 標準構文を理解するのに苦労しています。

以下は、私が試した多くの組み合わせの1つです。2 番目の結合の内部テーブルは何ですか。それは最初の結合からの出力ですか、それともソース テーブルですか。

変更するコードがたくさんあるので、助けてください。

元の SQL ステートメント

select * from  
JT1 a, JT2 b, JT3 c  
where a.ID *= b.ID   
  and c.JOB *= b.JOB  

私の回心

select *   
from JT1 a  
 left outer join JT2 b   
 on a.ID = b.ID  
 right outer join JT3 c  
 on c.JOB = b.JOB  

以下は、SQL テーブルの定義とサンプル データです。

Create table JT1 (  
 ID   int(4)   not null,  
 NAME char(20) not null)  


Create table JT2 ( 
  ID  int(4)   not null, 
  JOB char(20) not null)  


Create table JT3 ( 
  JOB  char(20) not null, 
  DUTY char(20) not null)  

INSERT INTO dbo.JT1 VALUES(10, "Saunders")  
INSERT INTO dbo.JT1 VALUES(20, "Pernal")  
INSERT INTO dbo.JT1 VALUES(30, "Marenghi")  
INSERT INTO dbo.JT2 VALUES(20, "Sales")  
INSERT INTO dbo.JT2 VALUES(30, "Clerk")   
INSERT INTO dbo.JT2 VALUES(30, "Mgr")  
INSERT INTO dbo.JT2 VALUES(40, "Sales")  
INSERT INTO dbo.JT2 VALUES(50, "Mgr")  
INSERT INTO dbo.JT3 VALUES("Mgr","Evaluate")  
INSERT INTO dbo.JT3 VALUES("Mgr","Reports")  
INSERT INTO dbo.JT3 VALUES("Mgr","Meeting")  
INSERT INTO dbo.JT3 VALUES("Clerk","Stocking")  
INSERT INTO dbo.JT3 VALUES("Clerk","Customer Request")  
4

4 に答える 4

3

しばらく時間がかかりましたが、これを試してください:

select   a.ID,  a.NAME, b.ID,   b.JOB,  a.JOB,  a.DUTY    
from (Select * from #jt1    
      cross join #jt3  ) a 
left outer join #jt2 b    
  on a.ID = b.ID    and a.job = b.job

その左結合演算子を複数回使用する際の問題は、実際にはそこに隠されたクロス結合があることです。これにより正しい結果が得られるはずです。開発者が何をしているかを理解していなかったために結果がずっと間違っていたかどうかについては、あなただけが知ることができます。

于 2012-08-29T21:59:06.647 に答える
2

元のクエリは次と同等です。

select * 
from JT1 a
left join JT2 b on a.ID = b.ID
left join JT3 c on c.JOB = b.JOB
于 2012-08-29T21:21:59.613 に答える
1

*=と同等ですleft [outer] join

=*と同等ですright [outer] join

于 2012-08-29T21:26:39.467 に答える