2009-07-30 10 views
0

ich die unten Abfrage bin Ausführung mit Oracle ANSI-Outer-Join-Syntax links Es Rückkehr 107 Datensätze:oracle -linken äußere Verknüpfung ANSI Abfrage

SELECT bs_accts.acct_num, 
      bs_accts.acct_name, 
      br_data.record_id , 
     as_users.username, 
     br_fx.fx_rate , 
FROM bs_accts 
CROSS JOIN as_users 
CROSS JOIN br_fx 
left outer join br_data 
ON (as_users.userid = br_data.last_note_user AND br_fx.iso_src = br_data.user_ten) 
WHERE br_data.state=3  
AND (br_data.acct_id = bs_accts.acct_id) 
AND (bs_accts.acct_currency='SHS')   
AND  substr(bs_accts.acct_num,1,1)='T'  
AND br_fx.iso_dst = 'USD'; 

, wenn ich die gleiche Abfrage ohne ANSI-Syntax bin Ausführung Es Rückkehr 875 Datensätze .Ich möchte 875 Datensätze mit ANSI code.Below ist die ältere linke äußere Join-Syntax:

SELECT bs_accts.acct_num, 
      bs_accts.acct_name, 
      br_data.record_id , 
     as_users.username, 
     br_fx.fx_rate , 
FROM bs_accts,as_users,br_fx,br_data 
WHERE br_data.state=3  
AND (br_data.acct_id = bs_accts.acct_id) 
AND (bs_accts.acct_currency='SHS')   
AND  substr(bs_accts.acct_num,1,1)='T' 
AND  br_data.last_note_user=as_users.userid(+) 
AND br_data.user_ten = br_fx.iso_src(+) 
AND br_fx.iso_dst = 'USD'; 

gibt es etwas falsch mit ANSI-Code oben ??

Antwort

2

Sie verwenden CROSS JOIN, nicht LEFT OUTER JOIN, also ist es definitiv nicht die gleiche Abfrage.

Ihre alten Stil Syntax Abfrage falsch ist, oder zumindest nicht die äußere enthält beitreten br_fx, dass Sie vermutlich denken, es funktioniert, weil der Mangel an einem Symbol (+) auf diesem Teil:

AND br_fx.iso_dst = 'USD' 

Diese Bedingung negiert die (+) auf

AND br_data.user_ten = br_fx.iso_src(+) 

Sie so vielleicht verwendet gemeint:

AND br_fx.iso_dst(+) = 'USD' 
+0

Thnks aton Tony..Es funktioniert gut. –

0

Es sieht für mich so aus, als wäre deine Syntax falsch.

AND  br_data.last_note_user=as_users.userid(+) 
AND br_data.user_ten = br_fx.iso_src(+) 

... bedeutet, dass Sie alle Zeilen aus br_data halten, auch wenn sie in den anderen Reihen haben Streichhölzer nicht. Das wäre so, als würde man in der ersten Abfrage RECHTS JOIN verwenden.

Tatsächlich entfernt die WHERE-Klausel alle NULL, die durch den LINKEN JOIN eingeführt werden, wodurch Ihr OUTER JOIN zu einem INNER-Join wird.

left outer join br_data 
ON (as_users.userid = br_data.last_note_user AND br_fx.iso_src = br_data.user_ten) 
WHERE br_data.state=3  

Ich würde wirklich gern Sie uns wissen lassen, was Sie tatsächlich von Ihrer Anfrage möchten.

Ist es das?

SELECT bs_accts.acct_num, 
      bs_accts.acct_name, 
      br_data.record_id , 
     as_users.username, 
     br_fx.fx_rate 
FROM 
    br_data 
    join 
    bs_accts 
     on (br_data.acct_id = bs_accts.acct_id) 
     AND (bs_accts.acct_currency='SHS')   
     AND substr(bs_accts.acct_num,1,1)='T' 
     AND br_data.state=3  
    LEFT JOIN 
    as_users 
     ON br_data.last_note_user=as_users.userid 
    LEFT JOIN 
    br_fx 
     ON br_data.user_ten = br_fx.iso_src 
     AND br_fx.iso_dst = 'USD'; 

... wo Sie br_data und bs_accts wollen verbunden (auf all diese verschiedenen Dinge) und Einhaken dann in as_users und br_fx, aber nicht aus dem Join von br_data und bs_accts beseitigen alles?

Rob

+0

Thnks Aton Rob .. Es funktioniert gut. –

Verwandte Themen