2016-11-11 3 views
1

Ich habe eine Abfrage, die ein Ergebnis mit zwei Spalten von Ints erstellt.Verwenden des Ergebnisses einer Abfrage in einer anderen Abfrage ohne Unterabfrage

from_id | to_id 
--------------- 
    51 | 100 
    3  | 21 
    ... | ... 

Lassen Sie uns dieses Ergebnis nennen map_ids

Dann kann ich etwas tun, wie

SELECT * FROM some_table st WHERE st.id IN map_ids.to_id 

nur ausgewählte Material aus some_table, die eine ID hat, die das Ergebnis der to_id in der ersten Spiele Abfrage?

Ich möchte vermeiden, eine Unterabfrage zu verwenden, weil die Abfrage, die map_ids generiert, ist ziemlich lang und wird tatsächlich zweimal in der realen Auswahl aus some_table verwendet.

+0

Suchen Sie nach [Unterabfrage-Factoring] (https://docs.oracle.com/cloud/latest/db112/SQLRF/statements_10002.htm#i2077142)? –

Antwort

2

Es klingt, als ob Sie nach subquery factoring suchen. Sie können Ihre erste Abfrage in eine with Klausel setzen und dann zu dem in dem Hauptkörper verbinden:

WITH map_ids (from_id, to_id) as (
    ... you first query ... 
) 
SELECT columns 
FROM map_ids mi 
JOIN some_table st ON st.id = mi.to_id 

Sie auf map_ids später wieder beziehen können, beispielsweise in einem anderen Zweig eines union.

Sie können etwas wie where st.id in (select to_id from map_ids) machen, aber die Verbindung ist wahrscheinlich klarer (und vielleicht effizienter, je nachdem, was der Optimierer mit der echten Abfrage macht).

Verwandte Themen