SQL слияния Ignite не вставляет новую строку при использовании с вложенным выбором - PullRequest
0 голосов
/ 08 ноября 2018

Когда Merge SQL используется с вложенным Select, Merge неправильно обрабатывает агрегацию для новых строк. Например, таблица

CREATE TABLE Test1 (
  key1 int  PRIMARY key,
  Name varCHAR(52),
  count int
) WITH "template=REPLICATED, backups=0, CACHE_NAME=Test1";

Для объединения новых и существующих строк используется следующий SQL слияния, поскольку неизвестно, какие строки уже существуют или нет. Этот тип объединения / переноса типичен для случаев использования агрегации счетчиков.

MERGE INTO Test1(key1, name, count) VALUES
  (1, 'aaa', 500 + (SELECT count  FROM Test1 WHERE KEY1 = 1)),
  (2, 'bbb', 700 + (SELECT count  FROM Test1 WHERE KEY1 = 2)),
   ...
  (1000, 'zzz', 350 + (SELECT count  FROM Test1 WHERE KEY1 = 1000)),

Однако для новых строк Merge сохраняет NULL для количества вместо указанных значений счетчика. Этот тип агрегации для значений столбца типичен для объединения / переноса для случаев использования агрегации. Я также пытался использовать casewhen и ifnull в вложенном предложении select, но ни один из них не решил проблему. Есть ли решение этой проблемы слияния?

Кроме того, при наличии такого обходного решения использование вложенного выбора в Merge для строки может привести к тому, что строка SQL будет очень длинной для выполнения Merge для массового числа строк, что также типично для операции upsert. Имеет ли Ignite Merge сокращенную версию SQL, аналогичную той, которую MemSql предоставляет для всей строки SQL, а не для отдельной строки, как в

ON DUPLICATE KEY UPDATE count  = count  + VALUES(count) 

Спасибо.

Michael

1 Ответ

0 голосов
/ 14 ноября 2018

Вы пробовали COALESCE()?

(1, 'aaa', 500 + COALESCE((SELECT count  FROM Test1 WHERE KEY1 = 1), 0)),
...