雪花子查询

mic*_*al4 4 sql database postgresql snowflake-cloud-data-platform

我有两张桌子.Transaction(ID,TERMINALID)和Terminal(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;
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

SQL编译错误:无法计算不支持的子查询类型

如果我用特定值替换tr.TERMINALID,则错误消失.所以我不能从嵌套的SELECT引用父表.为什么这不可能?查询适用于MySQL.

Mar*_*ski 9

我担心Snowflake不支持这种相关的子查询.

您可以使用FIRST_VALUE计算最佳per-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
Run Code Online (Sandbox Code Playgroud)

您可以先运行子查询以查看它们的作用.

我们正在努力更好地支持子查询,并且可能有一个更简单的重写,但我希望它有所帮助.

  • 更好的子查询支持会很棒,但更好的是当它们不受支持时会出现更好的错误消息。如果问题是窗口函数或结果集限制,那么说出来会很有帮助。 (2认同)