Обновление базы столбцов на другой столбец - PullRequest
0 голосов
/ 06 мая 2011

Мне интересно, возможно ли сделать что-то вроде следующего:

UPDATE SomeTable st
    SET MyColumn1 = (SELECT SomeValue
                     FROM WhereverTable),

        MyColumn2 = ((SELECT AnotherValue
                     FROM AnotherTable)
                     *
                     MyColumn1);
WHERE MyColumn4 = 'condition'

Я думаю, что когда я умножу AnotherValue на MyColumn1, он все равно будет иметь старое значениеMyColumn1, а не новый, который должен быть SomeValue.

Я использую DB2, если это имеет значение.

Ответы [ 4 ]

1 голос
/ 06 мая 2011

Подсчитайте выражение умножения, используя исходное значение MyColumn1, а не значение, указанное в обновлении.Если вы хотите использовать новое значение для MyColumn1 в формуле умножения, укажите и там новое выражение.Кроме того, вы должны поместить MIN, MAX или FETCH FIRST ROW ONLY в подзапросы, чтобы предотвратить возвращение нескольких строк.

0 голосов
/ 24 июня 2011

Предполагая, что таблицы всегда возвращают одну (и только одну) строку, следующее должно работать нормально:

UPDATE SomeTable st SET (MyColumn1, MyColumn2) = (SELECT SomeValue, 
                                                         AnotherValue * MyColumn1
                                                  FROM WhereverTable wt
                                                  CROSS JOIN AnotherTable at)
WHERE MyColumn4 = 'condition'

Это обновит MyColumn2 по желанию (используя старое значение MyColumn1).
Очевидно, что если есть больше / необязательные строки, все усложняется.

0 голосов
/ 06 мая 2011

Попробуйте это (не проверено):

UPDATE SomeTable 
    SET MyColumn1 = (SELECT SomeValue
                     FROM WhereverTable),

        MyColumn2 = MyColumn1 * (SELECT AnotherValue
                                 FROM AnotherTable)
WHERE MyColumn4 = 'condition';

Этот стандартный синтаксис SQL-92 требует скалярных подзапросов, т. Е. Оба значения WhereverTable и AnotherTable должны состоять из нуля или одной строки.Чаще всего эти строки необходимо «коррелировать», используя идентификаторы (или условия или аналогичные) в подзапросах, и это делается как в предложении SET, так и в выражении WHERE в выражении UPDATE, например:SQL-92, не проверено):

UPDATE SomeTable
   SET MyColumn1 = (
                    SELECT wt.SomeValue
                      FROM WhereverTable AS wt
                     WHERE wt.some_table_ID = SomeTable.some_table_ID
                   ),
       MyColumn2 = MyColumn1 * (
                                SELECT av.AnotherValue
                                  FROM AnotherTable AS av
                                 WHERE wt.another_table_ID = SomeTable.another_table_ID
                               )
 WHERE MyColumn4 = 'condition'
       AND EXISTS (
                   SELECT *
                     FROM WhereverTable AS wt
                    WHERE wt.some_table_ID = SomeTable.some_table_ID
                  )
        OR EXISTS (
                   SELECT *
                     FROM AnotherTable AS av
                    WHERE wt.another_table_ID = SomeTable.another_table_ID
                  ); 

Это можно переписать с помощью оператора MERGE SQL-99 с учетом менее повторяющегося кода.

0 голосов
/ 06 мая 2011

Без дополнительных подробностей трудно дать вам твердый ответ.Но я попробую:

    UPDATE SomeTable
       SET MyColumn1 = wt.SomeValue
           MyColumn2 = at.AnotherValue
      FROM SomeTable st
CROSS JOIN (
               SELECT SomeValue FROM WhereverTable
           ) wt
CROSS JOIN (
               SELECT AnotherValue FROM AnotherTable
           ) at
WHERE MyColumn4 = 'condition'

Если они действительно не связаны, то CROSS JOIN - это то, что вы хотите.Но имейте в виду, что подзапросы (в данном случае wt и at), которые связаны друг с другом, должны содержать только 1 запись, иначе СОЕДИНЕНИЯ вызовут создание более одной записи в предложении FROM.Не уверен, что он будет делать с этим запросом, но он, вероятно, сделает набор результатов не подлежащим обновлению.

Обратите внимание, что я использую синтаксис T-SQL в SQL Server, так как это то, с чем я больше знаком,Но быстрый Google обнаружил, что DB2 поддерживает перекрестные объединения (см. здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...