0

リモートDBとのDBリンクを使用して接続されたOracleデータベースがあります。リモート DB は OUTER JOIN とは何の関係もありません。そのため、異機種間サービスはクエリをいくつかの単純なクエリに変換し、結果を連結します。

たとえば、3 つのテーブルがあります。

create table join_email
(
EMAIL_ID FLOAT(10)
SENDER VARCHAR2(128)
)
INSERT INTO join_email VALUES (1,'bmdrrfh@gmail.com')
INSERT INTO join_email VALUES (2,'n3qcd@gmail.com')

create table join_email_receivers
(
EMAIL_ID FLOAT(10)
RECEIVER VARCHAR2(128)
)
INSERT INTO join_email_receivers VALUES (1,'9wtcptyzn@yahoo.com')
INSERT INTO join_email_receivers VALUES (1,'8w7o5@yahoo.com')
INSERT INTO join_email_receivers VALUES (1,'jlwtc@yahoo.com')
INSERT INTO join_email_receivers VALUES (2,'fpm@yandex.ru')
INSERT INTO join_email_receivers VALUES (2,'a@mail.com')

create table join_email_cc
(
EMAIL_ID FLOAT(10)
CC VARCHAR2(128)
)
INSERT INTO join_email_cc VALUES (1,'rg1yzjc@mail.com')

1 番目のテーブルから行をクエリし、2 番目と 3 番目の行を email_id で結合したままにします。私のクエリは次のようになります。

select em.sender, emr.receiver, emcc.cc
from join_email@DG4 em
LEFT JOIN join_EMAIL_RECEIVERS@DG4 emr on emr.email_id=em.email_id
LEFT JOIN join_EMAIL_CC@DG4 emcc on emcc.email_id=em.email_id
where em.sender = 'bmdrrfh@gmail.com' and emr.receiver = '9wtcptyzn@yahoo.com';

問題は、異機種間サービスがこのクエリを次の 2 つのクエリに変換することです。

<SELECT A2."EMAIL_ID",A2."SENDER",A1."RECEIVER" FROM "JOIN_EMAIL" A2,"JOIN_EMAIL_RECEIVERS" A1 WHERE A1."EMAIL_ID"=A2."EMAIL_ID" AND A2."SENDER"='bmdrrfh@gmail.com' AND A1."RECEIVER"='9wtcptyzn@yahoo.com'>

<SELECT "CC","EMAIL_ID" FROM "JOIN_EMAIL_CC">

2 番目のクエリは間違った FULL SCAN クエリです。email_id による WHERE 句である必要があります。

私の質問は、異機種間サービスにクエリを正しい順序で変換する方法を伝える方法ですか?

4

1 に答える 1

0

1 つ目LEFT OUTER JOINは実際INNER JOINには列の等価述語のためでありemr.receiver、したがって Oracle によって正しく変換されます。

リモート サイトで実行されている RDBMS が外部結合をネイティブにサポートしている場合、リモート サイトでビューを作成し、WHERE句を省略できます。

リモートサイト(DG4あなたの例では):

create view my_view as
select em.sender, emr.receiver, emcc.cc
from join_email em
LEFT JOIN join_EMAIL_RECEIVERS emr on emr.email_id=em.email_id
LEFT JOIN join_EMAIL_CC emcc on emcc.email_id=em.email_id

そして、ローカルサイトで:

select *
  from my_view@DG4
 where em.sender = 'bmdrrfh@gmail.com'
   and emr.receiver = '9wtcptyzn@yahoo.com'
于 2014-10-29T14:44:03.827 に答える