2017-09-20 4 views
0

はのは、次のように私は単純化されたテーブル構造を持っていると言うところの追加が加入解消参加しますテーブルAとテーブルBの間の最初の結合が満たされていれば、テーブルB→テーブルC→テーブルDに参加したいと思っています。表B - >表C - >表Dは、INNERとなるように結合しますテーブルAとテーブルBとの間の最初の結合が満たされるという点で存在する.-Oracleは、条件付きの不要な

また、表DのWHERE条件も必要とする。

本質的に、TABLE_B、TABLE_C、TABLE_Dの間のLEFT JOIN 'を削除したいのですが、TABLE_AとTABLE_Bの間で結合が満たされない場合があります。

非常に単純化されたデータですので謝罪します!

| Table A | 
| ID  | 
| 1  | 
| 2  | 
| 3  | 
| 4  | 
| 5  | 

| Table B | 
| ID | AID | 
| 1 | 5 | 

| Table C | 
| ID | BID | 
| 1 | 1 | 

| Table D   | 
| ID | CID | Value | 
| 1 | 1 | ABC | 

私が参加解消したい理由は、あなたができる表Aの5行の4のために、私は不要なのやってることは表Dに値を取得するために、3つのテーブル間で結合していること

+1

サンプルデータと望ましい結果が役立ちます。しかし、SQLには「条件付き結合」というものはありません。作業中のクエリをそのまま残してください。 –

+0

サンプルデータで更新された質問..テーブルDの値を取得するために3つのテーブルに渡ってテーブルAの5行のうち4つのテーブルの不要な結合を削除する必要がある理由がわかります – Basq

+0

この疑問の裏に推論が何であるか説明してください。パフォーマンス?不要な結合(あなたが呼び出したとき)は、一致する値がない場合でも起こりません。さらに、 'D.Value'は' A'のレコードと直接の関係がないので、結合をバイパスすることも意味をなさない。 –

答えて

0

ですジョインでブラケットを使用しますが、それが役立つかどうかはわかりません。

SELECT * FROM 
TABLE_A TBLA 
LEFT JOIN (TABLE_B TBLB 
      INNER JOIN TABLE_C TBLC ON TBLB.ID = TBLC.BID 
      INNER JOIN TABLE_D TBLD ON TBLC.ID = TBLD.CID) ON TBLA.ID = TBLB.AID 

この方法で、あなたはAがBのエントリと一致しますが、BはCとDにチェーンが一致していない、Bデータが取得されていない、ので、あなたがいることを言及したC

のために持っていますテーブルDにはどこの条件が必要ですか?それはあなたが常にDにリンクしなければならないことを意味しますか? Dに条件がある場合、その条件はすべての場合に満たされなければならないことに注意してください。したがって、Dからレコードが取得されない場合は、OR .. is nullを使用していない限り、最初の外部結合でもクエリからレコードが取得されません。