2013-12-13 3 views
2

Я хочу запустить инструкцию массового обновления, которая выбирает min и max столбца. Проблема в том, что существует несколько столбцов с нулевыми значениями. Если NULL, то я хочу установить MinValue на 0.Заявление об обновлении SQL с футляром с выбором внутри

Я следующее заявление, но я получаю сообщение об ошибке с SELECT и ELSE:

UPDATE Table1 SET MaxValue = (
     SELECT MAX(column1) FROM Table2), 
     MinValue = (CASE 
      WHEN SELECT MIN(column1) FROM Table2 <> NULL 
      THEN SELECT MIN(column1) FROM Table2 
      ELSE '0' 
     END) 

Что мне не хватает?

+3

Вы не можете сравнить с NULL таким образом, и я уверен, что MIN будет игнорировать NULL, если нет других параметров ... не причина вашей ошибки, но у вас будут проблемы. CASE спроектирован так, чтобы иметь один и тот же тип данных, поэтому, превратив 0 в строку, вы также можете повредить себе. – Ben

+0

Имеет ли таблица 1 какое-либо отношение к таблице2? – Mike

+1

Вы пытались помещать круглые скобки вокруг подзапросов в следующем примере: 'WHEN (SELECT MIN (column1) FROM Table2) <> NULL' –

ответ

2

Вот некоторые сразу очевидные корректировки, которые вам нужно сделать:

UPDATE Table1 SET MaxValue = (
     SELECT MAX(column1) FROM Table2), 
     MinValue = (CASE 
      WHEN (SELECT MIN(column1) FROM Table2) IS NOT NULL -- subquery in parentheses per John Gibb's comment and IS NOT NULL rather than <> NULL 
      THEN (SELECT MIN(column1) FROM Table2) -- subquery in parentheses per John Gibb's comment 
      ELSE 0 -- 0 rather than '0' 
     END) 

В противном случае, вы фактически сливаясь с CASE: Я хотел бы использовать COALESCE вместо ,

+1

Я все еще не думаю, что это будет работать без круглых скобок –

+0

Спасибо, @JohnGibb. Хороший улов. Я обновил ответ, чтобы отразить эту дополнительную корректировку. – J0e3gan

0

Есть ли в таблице1 только 1 ряд? Почему вам нужен стол для этого? Рассматривали ли вы использование представления?

SELECT COALESCE(MAX(column1),0) AS MaxValue, 
    COALESCE(MIN(column1),0) AS MinValue 
FROM dbo.Table2 

Кроме того, почему бы не объединить максимум, как на всякий случай.

Если вы должны использовать таблицу ...

UPDATE dbo.Table1 
SET MinValue = t.[min], 
    MaxValue = t.[max] 
FROM (SELECT MIN(column1) [min], MAX(column1) [max] FROM dbo.Table2) t 
3

Как насчет этого?

UPDATE a 
SET a.MaxValue = b.max_val, 
     a.MinValue = COALESCE(b.min_val, 0) 
FROM Table1 a 
     CROSS JOIN 
     (
      SELECT MAX(column1) max_val, 
       MIN(column1) min_val 
      FROM Table2 
     ) b 
1

Почему не

UPDATE Table1 SET MaxValue = (SELECT MAX(column1) FROM Table2), 
       MinValue = COALESCE(SELECT MIN(column1) FROM Table2, '0') 
; 
Смежные вопросы