使用子查询更新在雪花中不起作用
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
我期待看到他们最终如何解决问题。
【讨论】:
以上是关于使用子查询更新在雪花中不起作用的主要内容,如果未能解决你的问题,请参考以下文章