首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kudu条件UPSERT INTO

Kudu条件UPSERT INTO
EN

Stack Overflow用户
提问于 2020-09-19 08:58:33
回答 1查看 275关注 0票数 1

Kudu是否支持UPSERT INTOUPDATE部分的条件

我是否可以提供一个条件子句,根据插入值和目标表之间的比较,仅更新给定值?实际的用例是用最新的数据更新时间戳列。

这是我想象中的行为。

代码语言:javascript
复制
CREATE TABLE my_first_table
(
  id INT,
  name STRING,
  status INT,
  PRIMARY KEY(id)
)
PARTITION BY HASH PARTITIONS 4
STORED AS KUDU;

INSERT INTO my_first_table VALUES (1, "lee", 101), (2 "shiv", 102), (3,"bob", 103);

--CONDITION FALSE, UPDATE NOT PERFORMED
UPSERT INTO my_first_table AS t 
VALUES (3, "bobby", 100) AS v 
WHERE v.status > t.status

+----+------+--------+
| id | name | status |
+----+------+--------+
| 1  | lee  | 101    |
| 2  | shiv | 102    |
| 3  | bob  | 103    |
+----+------+--------+

--CONDITION TRUE, UPDATE PERFORMED
UPSERT INTO my_first_table AS t 
VALUES (3, "bobby", 100) AS v 
WHERE v.status < t.status

+----+------+--------+
| id | name | status |
+----+------+--------+
| 1  | lee  | 101    |
| 2  | shiv | 102    |
| 3  | bobby| 100    |
+----+------+--------+

在3不存在的情况下,它应该插入。

如果没有,是否有一个优雅的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2020-09-19 10:17:20

我发现的一个解决方案是在SELECT表达式中使用LEFT JOIN和过滤器。因此,假设我们有一个与目标表相同的表to_upsert,其中包含所有可能的upsert...

代码语言:javascript
复制
INSERT INTO to_upsert VALUES (3, "bobby" 100), (5, "newgal", 600);

UPSERT INTO my_first_table
SELECT to_upsert.id, to_upsert.name, to_upsert.status
FROM to_upsert
LEFT JOIN my_first_table ON to_upsert.id = my_first_table.id
WHERE my_first_table.status > to_upsert.status OR my_first_table.id IS NULL;

SELECT * FROM my_first_table;
+----+--------+--------+
| id | name   | status |
+----+--------+--------+
| 3  | bobby  | 100    |
| 1  | lee    | 101    |
| 2  | shiv   | 102    |
| 5  | newgal | 600    |
+----+--------+--------+

感谢收看本期“看我学sql”节目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63964313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档