2

以下は私が実行しようとしているクエリです。

    select 
          from_country_id, 
          to_country_id, 
          fromCountry.country_name as from_country_name, 
          to_country_id.country_name as to_country_name
    from TourDetails t 
    left join country fromCountry on fromCountry.id = t. from_country_id
    left join country toCountry on toCountry.id = t. to_country_id

国IDと国IDを保存するtourdetailsテーブルがあります。国IDと国名を持つ別の国テーブルがあります。

これで、tourdetailsテーブルをクエリするときに、国名も取得する必要があります。このために、郡のテーブルとの左結合を2回使用しています。

この国のテーブルに2回参加しなくても、fromとtoの国の両方の国名を取得する方法はありますか?

4

4 に答える 4

1

クエリを最適化できない場合でも、クエリの実行を最適化できる可能性があります。クエリの説明計画を確認する必要があります。ネストされたループを使用している場合は、ハッシュを強制する価値があるかもしれません/*+USE_HASH(country) */

于 2012-07-18T11:00:45.693 に答える
1

要するに、タプル (ツアーでは [from, to]) に基づいて国の詳細 (名前) を取得することになります。

私の知る限り、それは可能ですexists。以下のいずれかが当てはまる場合は、ご覧ください。

スキーマ:

create table country (
  country_id varchar2(10)
);

create table tour
(
  from_country_id varchar2(10),
  to_country_id varchar2(10)
);

データ:

insert into country select 'AU' from dual;
insert into country select 'UA' from dual;
insert into country select 'UK' from dual;

insert into tour select 'AU', 'UA'  from dual;
insert into tour select 'UK', 'UA'  from dual;
insert into tour select 'UA', 'AU'  from dual;

ソリューション自体:

select
  country_from.country_id from_, 
  country_to.country_id to_ 
from 
  country country_from,
  country country_to
where exists
  (select
     from_country_id, 
     to_country_id
   from tour 
   where 
     from_country_id = country_from.country_id 
    and 
     to_country_id = country_to.country_id)

内部結合は必要ありません:-)

于 2012-07-18T11:23:59.243 に答える
0

内部結合は、左結合よりもはるかに高速に実行されることがあります。データに参照整合性が適用されている場合、内部結合と左結合は同じ結果になります。参照整合性とは、外部キーのすべてのインスタンスが参照先テーブルの既存の行を参照することを意味します。

参照整合性は、データ定義で宣言された制約を介して DBMS によって実施できます。場合によっては別の方法として、新しいデータをロードするプロセスで参照整合性を強制することもできます。通常は、DBMS で参照整合性を強制することをお勧めします。

于 2012-07-18T11:15:35.637 に答える
0

1 つの結合でそれを行うことができますが、結合条件にor(またはin) が含まれていることと、おそらくあまり明確ではないコードが必要です。

select t.from_country_id,
    t.to_country_id,
    max(case when c.id = from_country_id then c.country_name end)
        as from_country_name,
    max(case when c.id = to_country_id then c.country_name end)
        as to_country_name
from tourdetails t
join country c on c.id = t.from_country_id or c.id = t.to_country_id
group by t.from_country_id, t.to_country_id;

これと 2 つの結合の間にパフォーマンスの違いはあまりないかもしれません。テストして確認する必要があります。この場合の「最適化」の意味によって異なります。ここでのスタイルはおそらくもっと問題だと思います-結合の数を減らすことと、返されたデータのより複雑な操作をトレードオフします。

于 2012-07-18T12:02:51.177 に答える