5

我有两张桌子。交易(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 编译错误:无法评估不支持的子查询类型

如果我用特定值替换tr.TERMINALID ,错误就会消失。所以我不能从嵌套的 SELECT 中引用父表。为什么这是不可能的?查询在 MySQL 中工作。

4

2 回答 2

13

恐怕雪花不支持这种相关的子查询。

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

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

我们正在努力改进对子查询的支持,可能会有更简单的重写,但我希望它有所帮助。

于 2016-12-22T19:21:20.363 回答
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
    ;

更新:

  • length for type varchar cannot exceed 10485760
  • 只需使用 type varchar(or 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
        ;

奖励更新:避免使用标量子查询并使用普通旧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"
        )
        ;
于 2016-12-21T13:46:48.703 回答