2017-07-18 9 views
0

Ich schrieb eine Abfrage, die wie folgt aussehen:SQL bedingte Auswahl Oracle SQL

select 
    q_id, 
    s_id, no, 
    date, 
    nm, 
    p 
from 
    (select * from table1 where q_id = 100) tb1 
left join 
    (select * from table2 where q_id = 100 and date = left(getdate(),11)) tb2 
    on tb2.s_id = tb1.s_id 
join 
    table3 tb3 
    on tb3.s_id = tb1.s_id 
order 
    by no ASC; 

ich dies in eine Java-Controller am Putten und q_id wird die Eingangsgröße sein. Kann ich die Abfrage trotzdem so ändern, dass ich q_id (q_id = 100) einmal statt zweimal Wert zugebe und trotzdem das gleiche Tabellenergebnis erreiche?

+0

Markieren Sie die korrekte Datenbank, die Sie verwenden –

+1

Es gibt keine 'getdate()' Funktion in Oracle. Welches DBMS benutzt du ** wirklich **? –

+0

Ich benutze Oracle SQL Developer – Deb

Antwort

0

Wenn Sie die gleiche Spalte q_id in der WHERE-Klausel Ihrer Inline-Ansichten tb1 und tb2 verwenden, sollten Sie tb1 und tb2 nach diesen Kriterien verknüpfen. Dann benötigen Sie nur eine WHERE-Bedingung, die auf q_id verweist.

Auch als a_horse_with_no_name kommentiert, bin ich nicht ganz sicher, was Sie mit der Funktion get_date() erreichen wollen. In meinem Beispiel ging ich davon aus, dass Sie versuchen, Ergebnisse zu filtern, indem Sie nur diejenigen für den aktuellen Tag zurückgeben. Dafür habe ich sysdate und die TRUNC-Funktion verwendet. Wenn Sie versuchen, etwas anderes zu erreichen, ändern Sie die WHERE-Klausel entsprechend.

Als eine Randnotiz empfehle ich nur explizite Variablenreferenzierung zu verwenden und 'SELECT *' zu vermeiden, insbesondere wenn Sie Fragen zum Stapelwechsel stellen. Damit war ich nicht sicher, aus welcher Tabelle die Variablen 'nm', 'no' und 'p' stammen. Ich nahm sie aus der Tabelle waren 3.

SELECT 
    TB1.q_id, 
    TB1.s_id, 
    TB2.date, 
    TB3.no, 
    TB3.nm, 
    TB3.p 
FROM table1 TB1 
INNER JOIN table3 TB3 
    ON TB1.s_id = tb3.s_id 
LEFT JOIN table2 TB2 
    ON TB1.s_id = TB2.s_id 
     AND TB1.q_id = TB2.q_id 
WHERE TRUNC(TB2.date) = TRUNC(sysdate) 
    AND TB1.q_id = 100 
ORDER BY 
    TB3.no ASC 
; 

Wenn Ihre Tabellen korrekt indiziert sind, gibt es nicht eine Leistung durch den Verlust der vorgefilterten in-line Ansichten getroffen werden sollte.

+0

Ich kann nicht auf q_id beitreten, weil die ersten beiden Tabellen viele zu viele Beziehungen sind (viele s_id zu vielen q_id), das ist der Grund, warum ich auf q_id zuerst gefiltert, bevor Sie die ersten beiden Tabellen, und dann bei s_id mitmachen. Ich kann es nicht anders herum tun (filtere auf q_id und schließe mich s_id an), um das zu erreichen, was ich erreichen muss. Idealerweise würde ich mich der Kombination q_id und s_id anschließen, die einzigartig sein wird, aber ich habe es versucht und es gab eine leere Tabelle zurück. – Deb

+0

Es funktionierte mit dem Beitritt auf zwei Spalten! Ich habe wahrscheinlich früher ein paar Fehler gemacht. Danke und Danke für die Vorschläge zu Terminen. – Deb

+0

Froh, es hat funktioniert! – dreamwork