SQL - Beziehung zwischen einer Unterabfrage und einer äußeren Tabelle

Problem

Ich muss die Regeln besser verstehen, wann ich auf eine äußere Tabelle in einer Unterabfrage verweisen kann und wann (und warum) das eine unangemessene Anforderung ist. Ich habe in einer Oracle SQL-Abfrage eine Duplizierung festgestellt, die ich überarbeiten möchte. Beim Versuch, meine referenzierte Tabelle in eine gruppierte Unterabfrage umzuwandeln, treten jedoch Probleme auf.

Die folgende Anweisung funktioniert ordnungsgemäß:

SELECT  t1.*  
FROM    table1 t1, 
INNER JOIN table2 t2 
        on t1.id = t2.id        
        and t2.date = (SELECT max(date) 
                       FROM   table2  
                       WHERE  id = t1.id) --This subquery has access to t1

Leider hat table2 manchmal doppelte Datensätze, so dass ich zuerst t2 aggregieren muss, bevor ich es mit t1 verbinde. Wenn ich jedoch versuche, es in eine Unterabfrage zu packen, um diesen Vorgang auszuführen, kann die SQL-Engine die äußere Tabelle plötzlich nicht mehr erkennen.

SELECT  t1.* 
FROM    table1 t1, 
INNER JOIN (SELECT * 
            FROM  table2 t2
            WHERE t1.id = t2.id              --This loses access to t1
              and t2.date = (SELECT max(date) 
                             FROM   table2 
                             WHERE  id = t1.id)) sub on t1.id = sub.id 
                             --Subquery loses access to t1

Ich weiß, dass dies grundlegend andere Abfragen sind, die ich vom Compiler zusammenstellen lassen möchte, aber ich verstehe nicht, warum die eine funktionieren würde, die andere jedoch nicht.

Ich weiß, dass ich die Tabellenreferenzen in meiner Unterabfrage duplizieren und meine Unterabfrage effektiv von der äußeren Tabelle trennen kann, aber das scheint eine wirklich hässliche Art zu sein, diese Aufgabe zu erfüllen (was bei all der Duplizierung von Code und Verarbeitung der Fall ist).

Hilfreiche Referenzen

Ich fand diese fantastische Beschreibung der Reihenfolge, in der Klauseln in SQL Server ausgeführt werden: (INNER JOIN ON vs WHERE-Klausel). Ich benutze Oracle, aber ich würde denken, dass dies durchweg Standard ist. Es gibt eine klare Reihenfolge für die Klauselauswertung (wobei FROM an erster Stelle steht), sodass ich der Meinung bin, dass jede weiter unten in der Liste stehende Klausel Zugriff auf alle zuvor verarbeiteten Informationen haben würde. Ich kann nur davon ausgehen, dass meine 2. Abfrage die Reihenfolge irgendwie ändert, sodass meine Unterabfrage zu früh ausgewertet wird.

Darüber hinaus fand ich eine ähnliche Frage gestellt (Verweisen auf äußere Abfragetabellen in einer Unterabfrage ) aber obwohl der Input gut war, erklärten sie nie wirklich, warum er nicht das tun konnte, was er tut und gaben nur alternative Lösungen für sein Problem an. Ich habe ihre alternativen Lösungen ausprobiert, aber es verursacht mir andere Probleme. Diese Unterabfrage mit dem Datumsverweis ist für den gesamten Vorgang von grundlegender Bedeutung, sodass ich sie nicht loswerden kann.

Fragen

Ich möchte verstehen, was ich hier gemacht habe ... Warum kann meine ursprüngliche Unterabfrage die äußere Tabelle sehen, aber nicht, nachdem ich die gesamte Anweisung in eine Unterabfrage eingeschlossen habe?

Das heißt, wenn das, was ich versuche, nicht getan werden kann, wie kann die erste Abfrage am besten umgestaltet werden, um die Duplizierung zu beseitigen? Sollte ich zweimal auf table1 verweisen (mit allen erforderlichen Vervielfältigungen)? Oder gibt es (wahrscheinlich) einen besseren Weg, um dieses Problem anzugehen?

Danke im Voraus!

------BEARBEITEN------

Wie einige vermuteten, handelt es sich bei diesen Abfragen nicht um die eigentliche Abfrage, die ich überarbeite, sondern um ein Beispiel für das Problem, auf das ich stoße. Die Abfrage, mit der ich arbeite, ist viel komplizierter, daher zögere ich, sie hier zu posten, da ich befürchte, dass dadurch die Leute aus der Bahn geraten.

------AKTUALISIEREN------

Ich habe dies von einem Mitentwickler ausgeführt und er hatte eine mögliche Erklärung dafür, warum meine Unterabfrage den Zugriff auf t1 verliert. Da ich diese Unterabfrage in eine Klammer setze, glaubt er, dass diese Unterabfrage ausgewertet wird, bevor meine Tabelle t1 ausgewertet wird. Dies würde definitiv den Fehler "ORA-00904:" t1 "." Id ": Ungültiger Bezeichner" erklären, den ich erhalten habe. Es würde auch nahe legen, dass das Hinzufügen von Parens zu einer Anweisung wie die arithmetische Reihenfolge von Operationen innerhalb bestimmter Klauselauswertungen Priorität hat. Ich würde es immer noch lieben, wenn ein Experte abwägt, ob er zustimmt oder nicht. Dies ist eine logische Erklärung für das, was ich hier sehe.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage