oracle -left запрос на внешнее соединение ANSI - PullRequest
0 голосов
/ 30 июля 2009

Я выполняю следующий запрос с синтаксисом левого внешнего соединения Oracle ANSI, он возвращает 107 записей:

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';

когда я выполняю тот же запрос без синтаксиса ANSI, он возвращает 875 записей. Я хочу 875 записей с кодом ANSI. Ниже приведен более старый синтаксис левого внешнего соединения:

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';

Что-то не так с кодом ANSI выше ??

Ответы [ 2 ]

2 голосов
/ 30 июля 2009

Вы используете CROSS JOIN, а не LEFT OUTER JOIN, поэтому это определенно не тот же запрос.

Ваш синтаксический запрос старого стиля неверен или, по крайней мере, не содержит внешнего соединения с br_fx, которое, как вы, вероятно, предполагаете, из-за отсутствия символа (+) в этой части:

AND br_fx.iso_dst = 'USD'

Это условие отменяет (+), использованное в

AND br_data.user_ten = br_fx.iso_src(+) 

так, может быть, вы имели в виду:

AND br_fx.iso_dst(+) = 'USD'
0 голосов
/ 30 июля 2009

Мне кажется, что ваш синтаксис неправильный.

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

... означает, что вы сохраняете все строки из br_data, даже если у них нет совпадений в других строках. Это было бы похоже на использование RIGHT JOIN в первом запросе.

Фактически, предложение WHERE удаляет все NULL, введенные LEFT JOIN, превращая ваше OUTER JOIN в INNER соединение.

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     

Я бы очень хотел, чтобы вы сообщили нам, что вы на самом деле хотите от вашего запроса.

Это так?

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';

... где вы хотите объединить br_data и bs_accts (на все эти разные вещи), а затем подключиться к as_users и br_fx, но не исключать ничего из объединения br_data и bs_accts?

Rob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...