Kudu 条件 UPSERT INTO
Posted
技术标签:
【中文标题】Kudu 条件 UPSERT INTO【英文标题】:Kudu Conditional UPSERT INTO 【发布时间】:2020-09-19 00:58:33 【问题描述】:Kudu 是否支持UPSERT INTO
的UPDATE
部分的条件?
我能否提供一个条件子句,仅根据插入值和目标表之间的比较来更新给定值? 实际用例是用最新的更新时间戳列。
这是我想象的行为。
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不存在的情况下,应该插入。
如果没有,是否有一个优雅的解决方法?
【问题讨论】:
【参考方案1】:我找到的一个解决方案是使用LEFT JOIN
并在SELECT
表达式中进行过滤。因此,假设我们有一个表 to_upsert
与目标表相同,其中包含我们所有潜在的 upserts...
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。
【讨论】:
感谢您回答您的问题 :)以上是关于Kudu 条件 UPSERT INTO的主要内容,如果未能解决你的问题,请参考以下文章
Next 带有 Prisma 的 js:基于两个条件的 Upsert