Действительно ли возможно выполнить несколько обновлений с единственным SQL-оператором ОБНОВЛЕНИЯ?

Как насчет просто

var getNotifications = Promise.promisify(adapter.getNotifications.bind(adapter));

или, возможно,

var getNotifications = Promise.promisify(function () {
    return adapter.getNotifications.apply(adapter, arguments);
});

?

Я не уверен, что хорошо понимаю вашу проблему, но это должно убедитесь, что this привязан, а не undefined, когда вы делаете return getNotifications(dbUser);

28
задан Paulius 5 January 2009 в 02:32
поделиться

5 ответов

В более общем случае, где могло быть много сотен отображений к каждому из новых значений, Вы будете составлять отдельную таблицу старых и новых значений, и затем использовать это в операторе UPDATE. На одном диалекте SQL:

CREATE TEMP TABLE mapper (old_val CHAR(5) NOT NULL, new_val CHAR(5) NOT NULL);
...multiple inserts into mapper...
INSERT INTO mapper(old_val, new_val) VALUES('a.1', 'a1');
INSERT INTO mapper(old_val, new_val) VALUES('a-1', 'a1');
INSERT INTO mapper(old_val, new_val) VALUES('b.1', 'b1');
INSERT INTO mapper(old_val, new_val) VALUES('b-1', 'b1');
...etcetera...

UPDATE tbl
   SET title = (SELECT new_val FROM mapper WHERE old_val = tbl.title)
   WHERE title IN (SELECT old_val FROM mapper);

Оба избранных оператора крайне важны. Первым является связанный подзапрос (не обязательно быстро, но быстрее, чем большинство альтернатив, если таблица картопостроителя имеет тысячи строк), который вытаскивает новое значение из таблицы отображения, которая соответствует старому значению. Второе гарантирует, что только те строки, которые имеют значение в таблице отображения, изменяются; это крайне важно как иначе, заголовок будет установлен в NULL для тех строк без отображающейся записи (и те были записями, которые были в порядке, прежде чем Вы начали).

Для нескольких альтернатив, операции СЛУЧАЯ в порядке. Но если у Вас будут сотни или тысячи или миллионы отображений для выполнения, затем Вы, вероятно, превысите пределы длины SQL-оператора в Вашем DBMS.

22
ответ дан Jonathan Leffler 14 October 2019 в 10:40
поделиться

Или

   Update Table set 
     title = Replace(Replace(title, '.', ''), '-', '')
   Where title Like '[ab][.-]1'
0
ответ дан Charles Bretana 14 October 2019 в 10:40
поделиться

Если преобразования так же просты как Ваши примеры, Вы могли бы сделать обновление с определенной обработкой строк:

UPDATE tbl 
SET title = left(title, 1) + right(title, 1) 
WHERE title IN ('a-1', 'a.1', 'b-1', 'b.1')

что-то хотело бы ту работу за Вас?

3
ответ дан Matt Hamilton 14 October 2019 в 10:40
поделиться

Можно использовать один оператор и много операторов выбора

update tbl
  set title = 
    case
      when title in ('a-1', 'a.1') then 'a1'
      when title in ('b-1', 'b.1') then 'b1'
      else title
    end

, Конечно, это вызовет запись на каждой записи, и с индексами, это может быть проблема, таким образом, можно отфильтровать только строки, Вы хотите измениться:

update tbl
  set title = 
    case
      when title in ('a-1', 'a.1') then 'a1'
      when title in ('b-1', 'b.1') then 'b1'
      else title
    end
where
  title in ('a.1', 'b.1', 'a-1', 'b-1')

, Который сократит количество записей к таблице.

24
ответ дан casperOne 14 October 2019 в 10:40
поделиться

Отделывание ответа Jonathan.

UPDATE tbl
   SET title = new_val
FROM mapper
WHERE title IN (SELECT old_val FROM mapper)
     AND mapper.old_val = tbl.title;

Его начальная версия потребовала бы большого количества чтений к таблице картопостроителя.

9
ответ дан mrdenny 14 October 2019 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: