Куду Условное ВСТАВЛЕНИЕ В

Поддерживает ли Kudu условия для UPDATE части UPSERT INTO?

Могу ли я предоставить условное предложение только для обновления заданных значений на основе сравнения между вставляемыми значениями и таблицей назначения? Фактический вариант использования — обновить столбец метки времени последним.

Вот поведение, как я себе это представляю.

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 не существует, его следует вставить.

Есть ли элегантный обходной путь, если нет?


person yogda    schedule 19.09.2020    source источник


Ответы (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.

person yogda    schedule 19.09.2020