2016-12-21 50 views
2

我有兩個表。 交易(ID,TERMINALID)和終端(ID,TERMINALID,EXPORT_DATE)。目標是從獲取每一行交易表最新從記帳終端表。雪花被用作後端。雪花子查詢

我有這樣的SQL查詢:

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; 

但我得到這個錯誤:

SQL compilation error: Unsupported subquery type cannot be evaluated

錯誤消失,如果我更換tr.TERMINALID有一個特定的值。所以我不能從嵌套的SELECT引用父表。爲什麼這是不可能的?查詢在MySQL中起作用。

+0

如果子查詢應該是*標量*子查詢?順便說一句:將一個列別名添加到子查詢。 – wildplasser

+0

是的,子查詢應該從一行返回一列值。因此,有LIMIT。 – michal4

+0

請將表格的表格定義添加到您的問題中。 (表格列名稱是否真的是混合/上層?) – wildplasser

回答

2

恐怕雪花不支持此相關子查詢類。

你可以達到你想要使用FIRST_VALUE來計算最佳的每terminalid ID是什麼:

-- 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 

您可以先運行子查詢,看看他們做什麼。

我們正在努力使我們對子查詢的支持更好,可能還有一個更簡單的重寫,但我希望它有幫助。

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
  • 只是使用類型varchar(或text)代替

在這裏工作(帶引號標識符):

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:避免標量子查詢和使用普通的老NOT EXISTS(...)與最近的日期以獲得記錄:

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

這沒有幫助。同樣的錯誤。 – michal4

+0

varchar的長度不是問題。可以創建長度爲16777216的varchar列,而不會在Sno​​wflake中出現任何錯誤。 – michal4

+0

如果你創建了這個東西(使用不同的表名),並且它運行,那麼varchar size **是**的問題。如果它不運行,那麼snowflake-datawarehouse是postgres的一個削弱版本。 – wildplasser