2 Stimmen

Postgres Referenz-Subquery im CASE-Statement

Ich versuche, eine Unterabfrage zu referenzieren, um den Wert in einer CASE-Anweisung zu verwenden. Aber innerhalb des SELECT-Statements kann ich nicht auf next_creation verweisen, da es einfach darauf besteht, dass die Spalte nicht existiert. Ich dachte daran, die gesamte Abfrage in eine CASE-Anweisung zu packen, aber die CASE-Anweisung würde erfordern, dass ich die Abfrage mehrmals ausführe, und das scheint albern.

Ich habe auch versucht, ein CROSS JOIN mit der Unterabfrage zu machen, aber es wird über das Nichtverweisen von tg in der Unterabfrage beschwert. Kernelfehler: FEHLER: Ungültige Referenz auf FROM-Klausel-Eintrag für Tabelle "tg" HINWEIS: Es gibt einen Eintrag für die Tabelle "tg", aber er kann nicht von diesem Teil der Abfrage aus referenziert werden.

Ich habe auch versucht, ein WITH zu verwenden, aber es hat im Grunde das gleiche Ergebnis wie CROSS JOIN. Also habe ich sogar zwei WITH-Klauseln angehängt, wobei die erste Abfrage die gleiche wie die Haupt-OUTER-Abfrage war, damit die zweite Klausel die Werte verwenden konnte...ich habe einen Fehler erhalten.

Gibt es eine Möglichkeit, die Unterabfrage zu referenzieren, z. B. indem man sie in einer Variablen festhält, um sie zu verwenden, während die Unterabfrage trotzdem das tg aus der äußeren Abfrage nutzen kann?

SELECT *, (
    SELECT
        tg2.created
    FROM tocom t
    LEFT JOIN tocom_g_assoc ON tocom_g_assoc.table_id = t.id AND tocom_g_assoc.tocom_g_id != tg.id
    LEFT JOIN tocom_g tg2 ON tg2.id = tocom_g_assoc.tocom_g_id
    WHERE t.id IN ( SELECT t_id FROM tocom_g_assoc WHERE tocom_g_assoc.tocom_g_id = tg.id )
        AND tg2.createdt > tg.created
        AND tg2.created IS NOT NULL
    ORDER BY tg2.created ASC
    LIMIT 1
) next_creation

/*
Hier möchte ich eine CASE-Anweisung machen, aber rein hypothetisch würde eine einfache next_creation - tg.dissolved_at ausreichen
*/

FROM wp p
LEFT JOIN tocom_g tg ON tg.id = p.tocom_g_id
WHERE tg.dissolved_at IS NOT NULL

1voto

Senica Gonzalez Punkte 7666

Ich erkannte das Problem.

Also ließ ich es als Select stehen, das die Unterabfrage zurückgibt. Dann umhüllte ich das Ganze in einen weiteren Select und machte diese Abfrage zur FROM-Anweisung. So konnte ich dann beliebig mit den zurückgegebenen Werten arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X