2017-04-23 3 views
0

Ich habe folgende Anfragen:Andere effiziente Art und Weise schreiben mehrere Auswahl

select * from 
    (select volume as vol1 from table1 where code='A1' and daytime='12-may-2012') a, 
    (select volume as vol2 from table2 where code='A2' and daytime='12-may-2012') b, 
    (select volume as vol3 from table3 where code='A3' and daytime='12-may-2012') c 

Ergebnis:

vol1 vol2 vol3 
20 45  

Was andere effiziente Möglichkeit wäre, diese Abfrage (in realem Fall schreiben könnte es sein, bis zu 15 Unterabfragen), unter der Annahme, dass Daten für das ausgewählte Datum nicht immer in einer dieser Tabellen vorhanden sind? Ich denke, es könnte beitreten, aber nicht sicher.

Dank, S

+0

Versuchen Sie es mit Unionen – gaganshera

+1

Wenn diese aus verschiedenen Tabellen stammen, dann benötigen Sie eine Art Abfrage für jede Tabelle. –

+0

kann Union nicht verwenden, sollte jede Spalte für jeden Wert sein. –

Antwort

0

Wenn die Sorge, dass die Daten existieren könnten nicht der Fall, dann Cross-Join ist nicht der richtige Betreiber. Wenn eine Unterabfrage null Zeilen zurückgibt, erhalten Sie eine leere Ergebnismenge.

höchstens eine Zeile Angenommen wird pro Abfrage zurückgegeben, nur Unterabfragen verwenden im select:

select (select volume from table1 where code = 'A1' and daytime = date '2012-05-12') as vol1, 
     (select volume from table2 where code = 'A2' and daytime = date '2012-05-12') as vol2, 
     (select volume from table3 where code = 'A3' and daytime = date '2012-05-12') as vol3 
from dual; 

Wenn ein Wert fehlt, wird es NULL sein. Wenn eine Unterabfrage mehr als eine Zeile zurückgibt, erhalten Sie einen Fehler.

Ich bevorzuge ANSI-Standardformate, weshalb ich das date Schlüsselwort verwende.

Ich bin sehr verdächtig, ein Feld datetime mit einer Datumskonstante ohne Zeitkomponente zu vergleichen. Ich würde die Logik darauf überprüfen. Vielleicht beabsichtigen Sie trunc(daytime) = date '2012-05-12' oder etwas Ähnliches.

Ich sollte auch beachten, dass, wenn die Leistung ein Problem ist, dann wollen Sie einen Index für jede Tabelle auf .

+0

Gordon, aber das ist immer noch fast die gleiche Logik wie die ursprüngliche Abfrage, es wurde vor einigen Jahren gebaut, ich dachte, es könnte eine andere Art sein, zum Beispiel nicht versuchen, tagsüber zu wiederholen, es ist das gleiche für alle 3 Unterabfragen und usw. –

+0

@JoeGreen. . . Dies ist nicht genau die gleiche Logik. Die ursprüngliche Abfrage gibt keine Zeilen zurück, wenn eine der Unterabfragen keine Zeilen zurückgibt. –

+0

Gordon, lassen Sie uns sagen, es wird nicht Null Datensätze sein und Ergebnis sowieso erwarten, was wäre Abfrage mit Join verwenden? –

Verwandte Themen