2017-02-27 2 views
0

Ich weiß, diese Frage wurde mehrmals gestellt, aber es hat meine Frage nicht gelöst.Erstellen Sie Ansicht durch Ziehen von Daten aus drei Tabellen

Ich habe drei Tabellen, JD, LYR und VC, alle drei haben unterschiedliche Schema. Ich möchte eine Ansicht erstellen, die Daten aus diesen drei Tabellen so extrahiert, dass sie Datensätze enthält, die in JD und LYR und auch in LYR und VC vorhanden sind. Also, ich denke es sollte eine innere Verbindung zwischen JD/LYR und LYR/VC geben. Ich möchte nicht JD und VC beitreten.

Ich schrieb die sql, aber wenn es den Datensatz zeigt, der in JD und LYR vorhanden ist, wird es nicht den übereinstimmenden Datensatz zwischen LYR und VC und umgekehrt anzeigen. Mein aktuelles SQL ist wie folgt.

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; 

Ich habe versucht, und änderte die Join-Typen auf andere wie Linke Außen usw. verbindet, aber nicht work.Any Hilfe wird für diese Ansicht in Bezug auf die SQL geschätzt.

Vielen Dank im Voraus, KB.

+0

Sie wählen jd, lyr und vcase Säulen, von jd, lyr und vc ... – jarlh

+0

einige Beispieltabellendaten und das erwartete Ergebnis hinzufügen - auch formatierten Text. – jarlh

+0

Bitte bearbeiten Sie Ihre Frage, um Beispieldaten und erwarteten Ausgang aufzunehmen ... – JohnHC

Antwort

0

TRY THIS: Nach Ihrer Beschreibung Sie haben alle die Datensätze in LYR und sowohl die Tabellen JD & VC einige freigegebene Daten aus dieser Tabelle haben. Aber JD & VC kann oder auch nicht gleichen Daten haben, so in diesem Fall, dass Sie LEFT JOIN mit LYR als Haupttabelle zu tun haben, wie unten angegeben:

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

Vielen Dank für die schnelle Hilfe. Ich folgte den Vorschlägen von Suraz und es scheint, als würde es funktionieren. Ich werde später mehr nachprüfen. –

+0

Wird vermieden, Zeilen in LYR auszuwählen, in denen weder in JD noch in VC eine übereinstimmende Zeile vorhanden ist? –

0

Probieren Sie etwas wie unten:

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

Ihre aktuellen SQL werden nur Aufzeichnungen zeigen, wo die Daten in allen drei vorhanden ist Tabellen. Es klingt für mich wie Sie sql wollen, die Daten in bestimmten Arten von äußeren Joins zeigen wird.

Eine erste Version wäre, die Abfrage als UNION statt als JOIN zu schreiben (d. H. Zwei Abfragen mit einem einzigen inneren Join in ihnen und einer UNION ALL zwischen ihnen). Dies würde die Korrektheit garantieren.

Von dort aus können Sie möglicherweise etwas mit Outer Joins erstellen und Bedingungen, die möglicherweise besser funktionieren, aber es ist in der Regel am besten, zuerst die Richtigkeit zu gewährleisten.

0

Da Ihre Abfrage alle drei Tabellen innerlich verbindet, wird nur ein Datensatz angezeigt, in dem übereinstimmende Daten in allen drei Tabellen vorhanden sind. So wie ich es verstehe, soll der Datensatz angezeigt werden, wo es passende Daten in LYR und JDoder in LYR und VC (oder in allen drei) gibt.

Ich bin nicht einer Art und Weise bewusst ist dies direkt zu tun, schließt sich mit, so hatte ich links kommen sie mit einer zusätzlichen Bedingung:

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; 

Ein anderer möglicher Ansatz wäre UNION zu verwenden (und nichtUNION 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

Danke Jiri Tousek für die Hilfe. Appare es. Ihr SQL hat auch funktioniert, es ist nur ein bisschen mehr SQL aufgrund der Union und ich habe Tonnen von Feldern in allen drei Tabellen, so wird es riesigen Code zu arbeiten. Noch einmal vielen Dank. –

Verwandte Themen