2016-10-04 3 views
0

Как я могу написать запрос таким образом, чтобы результат оператора CASE WHEN был адаптирован к каждой строке. Так что в каждой строке результат будет 5. Большое спасибо!Адаптировать результат одной строки к другим строкам

CREATE TABLE DATA 
(`Person` CHAR(4), 
`Apples` INT(1), 
`Tomatoes` INT(1), 
`Result` INT(1) 
); 

INSERT INTO DATA 
(Person, Apples, Tomatoes) 
    VALUES ('Mark' , 1, 2), 
    ('Sepp', 2, 3), 
    ('Carl', 3, 1); 

UPDATE DATA 
SET `Result` = CASE WHEN (`Person` = 'Sepp') THEN (`Apples` + `Tomatoes`) END; 

Table of result as it should be

SQL fiddle demonstration

+0

Я бы выбрал 'UPDATE DATA SET Result = 5'. Вы хотите, чтобы каждый столбец имел фиксированное значение, поэтому нет необходимости в сложных правилах. –

+0

@LelioFaieta. Я не думаю, что 5 представляет фиксированное значение, а скорее результат добавления яблок Sepops и томатов. – jpw

+0

@jpw Я согласен. Но если вы видите желаемый результат, это всегда 5, а результат на строку никогда не будет 5. –

ответ

1

Если вы хотите, чтобы все строки, чтобы получить значение из строки Sepps вы можете сделать это с помощью подзапроса.

«Нормальный» путь был бы сделать это:

UPDATE DATA 
SET Result = (SELECT Apples + Tomatoes FROM DATA WHERE Person = 'Sepp') 

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

UPDATE DATA 
SET Result = (
    SELECT Value FROM (
    SELECT Apples + Tomatoes AS Value 
    FROM DATA WHERE Person = 'Sepp' 
    ) t 
); 
+0

Я вижу, что ваш код работает в скрипте SQL. Но когда я строю его именно так, как в моей базе данных, я получаю сообщение, которое вы уже упомянули: «Вы не можете указать целевую таблицу ... для обновления в предложении FROM? – Sven

+0

@Sven Попробовали ли вы первую или вторую версию в мой ответ. Чтобы быть ясным: второй правильный, и первый не будет работать. Для MySQL, который есть. – jpw

+0

Я пробовал второй. – Sven