2017-02-27 7 views
0

この質問は何度か尋ねられていますが、私の質問は解決しませんでした。3つのテーブルからデータを取得してビューを作成する

私は3つのテーブルJD、LYR、VCを持っていますが、3つのスキーマにはそれぞれ異なるスキーマがあります。私はこれらの3つのテーブルからJDとLYR、そしてLYRとVCに存在するレコードを持つようにデータをプルするビューを作成したいと思います。ですから、JD/LYRとLYR/VCの間に内部結合があるはずです。私はJDとVCに加わりたくありません。

私はSQLを書きましたが、JDとLYRにあるレコードを表示すると、LYRとVCの間に一致するレコードが表示されず、その逆もありません。私の現在のSQLは以下の通りです。

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VC.ACCOUNT_STATUS, 
     VC.ACCOUNT_NUMBER 
FROM JD 
INNER JOIN LYR 
    ON (JD.REQ_ID = LYR.REQ_ID) 
INNER JOIN VC 
    ON LYR.REQ_ID = VC.REQUEST_ID; 

私は他に参加の種類を試してみましたが、変更は、左の外側などのように参加しますが、work.AnyヘルプはこのビューのSQLについては理解されるであろうしませんでした。

ありがとうございます。 KB

+0

あなたがLYRとVC、JDから、JD、LYRとvcase列を選択... – jarlh

+0

は、いくつかのサンプル・テーブル・データと予想される結果を追加します。 – jarlh

+0

質問を編集して、サンプルデータと期待される出力を含めてください。 – JohnHC

答えて

0

TRY THIS:あなたの説明によると、すべてのLYR内のレコードとの両方のテーブルJD & VCを持っているが、この表からいくつかの共有のデータを持っています。データはすべての3つの中に存在しているレコードのみが表示されます

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
LEFT JOIN JD ON JD.REQ_ID = LYR.REQ_ID 
LEFT JOIN VC ON LYR.REQ_ID = VC.REQUEST_ID; 
+0

迅速なサポートをお寄せいただきありがとうございます。私はSurazの提案に続き、それが機能しているように思えます、後で詳しく調べます。 –

+0

これは、JDとVCのどちらにも一致する行がないLYRの行を選択しないようにしますか? –

0

以下のようなものを試してみてください:

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT * FROM (SELECT JD.REQ_ID,JD.REF_NO,LYR.OID_VAL,VCASE.ACCOUNT_STATUS,VCASE.ACCOUNT_NUMBER 
FROM JD INNER JOIN LYR ON (JD.REQ_ID = LYR.REQ_ID)) a INNER JOIN VC 
ON a.REQ_ID = VC.REQUEST_ID; 
0

あなたの現在のSQL:下記としては、メインテーブルとしてLYRLEFT JOINを行う必要があり、この場合のように、しかしJD & VCは、同じデータがあってもなくてもよいですテーブル。ある種の外部結合に存在するデータを表示するsqlが必要なように私には聞こえます。

最初のバージョンでは、JOINではなくUNION(つまり、1つの内部結合とその間のUNION ALLを持つ2つのクエリ)としてクエリを記述することができます。これは正しさを保証することになります。

そこから、外部結合を使用して何かを作成することができます。また、パフォーマンスが向上する可能性がありますが、通常、最初に正しいことを確認するのが最善です。

0

クエリは3つのテーブルをすべて内部結合しているため、3つのテーブルすべてに一致するデータがある場合にのみレコードが表示されます。私が理解しているように、LYRJDまたはに一致するデータがある場合は、LYRVC(または3つすべて)でレコードを表示したいとします。

は、私が参加し使用して直接これを行う方法を認識していないので、私は、左の参加追加の条件とそれらをしたい:

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
LEFT JOIN JD 
    ON (LYR.REQ_ID = JD.REQ_ID) 
LEFT JOIN VC 
    ON (LYR.REQ_ID = VC.REQUEST_ID) 
WHERE JD.REQ_ID IS NOT NULL OR VC.REQUEST_ID IS NOT NULL; 

UNION(およびを使用するもう一つの可能​​なアプローチは次のようになりますないUNION ALL): - だけでなく、フォーマットされたテキスト

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
INNER JOIN JD 
    ON (LYR.REQ_ID = JD.REQ_ID) 
LEFT JOIN VC 
    ON (LYR.REQ_ID = VC.REQUEST_ID) 
UNION 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
INNER JOIN VC 
    ON (LYR.REQ_ID = VC.REQUEST_ID) 
LEFT JOIN JD 
    ON (LYR.REQ_ID = JD.REQ_ID); 
+0

Jiri Tousekさん、ありがとうございました。それを明らかにする。あなたのSQLも働いて、それはちょうど組合のためにSQLがもう少しで、3つのテーブルすべてにたくさんのフィールドがあるので、作業するには巨大なコードになります。もう一度ありがとう。 –

関連する問題