使用子查询更新在雪花中不起作用

Posted

技术标签:

【中文标题】使用子查询更新在雪花中不起作用【英文标题】:Update using subquery not working in Snowflake 【发布时间】:2019-10-14 21:07:33 【问题描述】:

(代表雪花用户提交)


我们在表中加载了错误的重复 ID,我们需要更正它。更新 id 的规则是每当时间差超过 30 分钟时,id 应该是新的/唯一的。我已经编写了查询来过滤掉它,但是没有发生更新

下面的查询用于查找要更新的 ID。为了测试,我使用了一个特定的 id。

select id,

BEFORE_TIME,

TIMESTAMP,

datediff(minute,BEFORE_TIME,TIMESTAMP) time_diff,

row_number() over (PARTITION BY id ORDER BY TIMESTAMP) rowno,

concat(id,to_varchar(rowno)) newid from

(SELECT id,

TIMESTAMP,

LAG(TIMESTAMP_EST) OVER (PARTITION BY visit_id ORDER BY TIMESTAMP) as BEFORE_TIME

FROM table_name t

where id = 'XX1X2375'

order by TIMESTAMP_EST)

where BEFORE_TIME is not NULL and time_diff > 30

order by time_diff desc

;

我可以看到 12 条具有相同 ID 和时差超过 30 的记录。但是当我尝试更新时。查询成功,但没有更新。

update table_name t

set t.id = c.newid

from

(select id ,

BEFORE_TIME,

TIMESTAMP,

datediff(minute,BEFORE_TIME,TIMESTAMP) time_diff,

row_number() over (PARTITION BY id ORDER BY TIMESTAMP) rowno,

concat(id,to_varchar(rowno)) newid from

(SELECT id,

TIMESTAMP,

LAG(TIMESTAMP) OVER (PARTITION BY visit_id ORDER BY TIMESTAMP) as BEFORE_TIME

FROM table_name t

where id = 'XX1X2375'

order by TIMESTAMP_EST)

where BEFORE_TIME is not NULL and time_diff > 30

order by time_diff desc) c

where t.id = c.id

and t.timestamp = c.BEFORE_TIME

;

请注意:

我什至从上面的子查询中创建了一个临时表 t1。

我可以看到表 t1 中的记录。

当使用主表进行选择时,我什至可以在主表的记录中看到。

但是当我尝试使用新的 t1 进行更新时。它只是显示零记录更新。

我什至尝试过合并但同样的问题。

MERGE INTO snowplow_data_subset_temp t

USING t1

ON (trim(t.visit_id) = trim(t1.visit_id) and trim(t1.BEFORE_DATE) = trim(t.TIMESTAMP_EST))

WHEN MATCHED THEN UPDATE SET visit_number = newid;

有任何建议、想法或解决方法吗?谢谢!

【问题讨论】:

【参考方案1】:

看起来他们可能遇到了两件事: 您创建 t1 的表是临时表还是克隆表?看看

Get_DDL('t1', 'schemaname');

检查下一个会话中临时表是否有任何限制。或者您可以查询表约束视图 “或者,通过查询信息架构中的 TABLE_CONSTRAINTS 视图视图,按架构(或跨数据库中的所有架构)检索所有表约束的列表。”来自:https://docs.snowflake.net/manuals/user-guide/table-considerations.html#referential-integrity-constraints

由于子查询工作正常 - 合并和更新语句是查找内容的线索,这是我在文档中找到的更多一般信息:

*子查询的限制: https://docs.snowflake.net/manuals/user-guide/querying-subqueries.html#limitations

您还可以通过更改会话来检查更新查询是否有任何错误:https://docs.snowflake.net/manuals/sql-reference/sql/update.html#usage-notes

ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE=TRUE;

以下是如何对 Temp 表使用更新的示例: https://snowflakecommunity.force.com/s/question/0D50Z00008P7BznSAF/can-you-use-a-cte-or-temp-table-with-an-update-statement-to-update-a-table

我期待看到他们最终如何解决问题。

【讨论】:

以上是关于使用子查询更新在雪花中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

雪花 ...Alter 表在雪花中的托管模式中不起作用

子查询中的子查询在配置单元中不起作用

更新查询在 mysql 工作台中不起作用

Oracle SQL - 多级相关子查询不起作用

更新查询在 codeigniter 中不起作用

Update 语句中的子查询在 Snowflake 中不起作用