2016-12-21 51 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