0
select
  whatever
from
  bank_accs b1,
  bank_accs b2,
  table3 t3
where
  t3.bank_acc_id = t1.bank_acc_id and
  b2.bank_acc_number = b1.bank_acc_number and
  b2.currency_code(+) = t3.buy_currency and
  trunc(sysdate) between nvl(b2.start_date, trunc(sysdate)) and nvl(b2.end_date, trunc(sysdate));

私の問題は、b2の日付(実際)チェックにあります。ここで、b2に(日付ごとに)無効なレコードしかない場合でも、t3xb1ごとに行を返す必要があります(もちろん、t3 =最大10個のテーブルが結合されています)。このビットを適切に外部結合するにはどうすればよいですか?ANSI結合は使用できません。単一のフラットクエリで使用する必要があります。ありがとう。

4

2 に答える 2

0

私があなたを理解していれば、b2 のすべての列に外側の記号 (+) を追加するだけです。

select
  whatever
from
  bank_accs b1,
  bank_accs b2,
  table3 t3
where
  t3.bank_acc_id = t1.bank_acc_id and
  b2.bank_acc_number = b1.bank_acc_number and
  b2.currency_code(+) = t3.buy_currency and
  trunc(sysdate) between nvl(b2.start_date(+), trunc(sysdate)) and nvl(b2.end_date(+), trunc(sysdate));
于 2012-09-06T09:55:52.230 に答える
0

古いスタイルの外部結合を不等式で記述することは可能ですが、エラーが発生しやすくなります。インライン ビューを使用することをお勧めします。外部結合は明確かつ明示的になります。

SELECT whatever
  FROM bank_accs b1,
       table3 t3,
       (SELECT b2.*
          FROM bank_accs b2
         WHERE trunc(sysdate) BETWEEN nvl(b2.start_date, trunc(sysdate)) 
                                  AND nvl(b2.end_date, trunc(sysdate))
       ) b2
 WHERE t3.bank_acc_id = t1.bank_acc_id
   AND b2.bank_acc_number = b1.bank_acc_number
   AND b2.currency_code(+) = t3.buy_currency;
于 2012-09-06T09:59:40.503 に答える