2

Ich habe zwei Tabellen. Transaktion (ID, TERMINALID) und Terminal (ID, TERMINALID, EXPORT_DATE). Das Ziel ist es, für jede Zeile von Transaktion Tabelle neueste abgerufen von Terminal Tabelle zu erhalten. Snowflake wird als Backend verwendet.Snowflake Unterabfrage

Ich habe diese SQL-Abfrage:

SELECT tr.ID, 
     (SELECT te.ID 
     FROM "Terminal" te 
     WHERE te.TERMINALID = tr.TERMINALID 
     ORDER BY te.EXPORT_DATE DESC 
     LIMIT 1) 
FROM "Transaction" tr; 

Aber ich bekomme diese Fehlermeldung:

SQL compilation error: Unsupported subquery type cannot be evaluated

Fehler verschwinden, wenn ich tr.TERMINALID mit einem bestimmten Wert zu ersetzen. Daher kann ich die Elterntabelle nicht von der geschachtelten SELECT-Anweisung referenzieren. Warum ist das nicht möglich? Abfrage funktioniert in MySQL.

+0

Ist die Unterabfrage eine * skalare * Unterabfrage? BTW: Fügen Sie der Unterabfrage einen Spaltenalias hinzu. – wildplasser

+0

Ja, Unterabfrage sollte einen Spaltenwert aus einer Zeile zurückgeben. Daher gibt es das LIMIT. – michal4

+0

Fügen Sie die Tabellendefinitionen für die Tabellen zu Ihrer Frage hinzu. (Sind die Tabellenspaltennamen * wirklich * gemischt/Großbuchstaben?) – wildplasser

Antwort

2

Ich fürchte, Schneeflocke nicht korrelierte Unterabfragen dies nicht unterstützt nett.

können Sie erreichen, was Sie wollen von FIRST_VALUE mit besten per-TerminalID-ID zu berechnen:

-- First compute per-terminalid best id 
with sub1 as (
    select 
    terminalid, 
    first_value(id) over (partition by terminalid order by d desc) id 
    from terminal 
), 
-- Now, make sure there's only one per terminalid id 
sub2 as (
    select 
    terminalid, 
    any_value(id) id 
    from sub1 
    group by terminalid 
) 
-- Now use that result 
select tr.ID, sub2.id 
FROM "Transaction" tr 
JOIN sub2 ON tr.terminalid = sub2.terminalid 

Sie Subqueries zuerst ausführen können, um zu sehen, was sie tun.

Wir arbeiten daran, unsere Unterstützung für Unterabfragen besser zu machen, und möglicherweise gibt es eine einfachere Neufassung, aber ich hoffe, es hilft.

0
SELECT 
tr.ID 
    , (SELECT te.ID 
    FROM "Terminal" te 
    WHERE te.TERMINALID = tr.TERMINALID 
    ORDER BY te.EXPORT_DATE DESC 
    LIMIT 1 
    ) AS the_id -- <<-- add an alias for the column 
FROM "Transaction" tr 
    ; 

UPDATE:

  • length for type varchar cannot exceed 10485760
  • nur Typ verwenden varchar (oder text) statt

Werke hier (mit Bezeichner in Anführungszeichen):

CREATE TABLE "Transaction" ("ID" VARCHAR(123), "TERMINALID" VARCHAR(123)) ; 
CREATE TABLE "Terminal" ("ID" VARCHAR(123), "TERMINALID" VARCHAR(123), "EXPORT_DATE" DATE); 

SELECT tr."ID" 
     , (SELECT te."ID" 
     FROM "Terminal" te 
     WHERE te."TERMINALID" = tr."TERMINALID" 
     ORDER BY te."EXPORT_DATE" DESC 
     LIMIT 1) AS meuk 
FROM "Transaction" tr 
     ; 

BONUS UPDATE: die skalare Unterabfrage vermeiden und plain old NOT EXISTS(...) verwenden den Datensatz mit dem jüngsten Datum zu erhalten:

SELECT tr."ID" 
     , te."ID" AS meuk 
FROM "Transaction" tr 
JOIN "Terminal" te ON te."TERMINALID" = tr."TERMINALID" 
     AND NOT EXISTS (SELECT * 
     FROM "Terminal" nx 
     WHERE nx."TERMINALID" = te."TERMINALID" 
     AND nx."EXPORT_DATE" > te."EXPORT_DATE" 
     ) 
     ; 
+0

Das hat nicht geholfen. Derselbe Fehler. – michal4

+0

Länge von Varchar ist kein Problem.Es ist möglich, eine varchar-Spalte mit der Länge 16777216 ohne Fehler in Snowflake zu erstellen. – michal4

+0

Wenn Sie dieses Zeug (mit verschiedenen Tabellennamen) erstellen, und es ausgeführt wird, dann ist Varchar Größe ** ** das Problem. Wenn es nicht läuft, dann ist snowflake-datawarehouse eine verkrüppelte Version von postgres. – wildplasser