2014-11-17 10 views
1

У меня есть база данных с двумя таблицами: «services» и «service_performance» Эти две таблицы имеют столбец SERVICE_ID.Значение столбца обновления MySQL с максимальным значением из другого столбца

В «сервисах» значения SERVICE_ID уникальны (каждая служба имеет один идентификатор/запись). В «service_performance» есть AVERAGE_MEMORY колонна с многократным въездом на service_id

Я пытаюсь обновить столбец max_value в таблице «услуги» с наивысшим AVERAGE_MEMORY значение, взятое из таблицы «service_performance».

Я знаю, что мой запрос является неправильным, потому что он выдает ошибку:

1054 - Неизвестный столбец «service_performance.SERVICE_ID» в «где предложение»

В то время как «service_performance.SERVICE_ID» действительно существует.

Вот мой запрос:

update _services 
set MAX_VALUE = (SELECT MAX(AVERAGE_MEMORY) AS SERVICE_ID FROM service_performance) 
where exists 
    (select * 
    from services 
    where `services`.`SERVICE_ID` = `service_performance`.`SERVICE_ID`); 
+0

У вашей таблицы «Service_Performance» есть поле с именем «SERVICE_ID»? –

+0

Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, который соответствует информации, представленной на шаге 1. – Strawberry

ответ

1

Вы должны найти, что эта версия работает в MySQL:

update services s join 
     (select service_id, MAX(AVERAGE_MEMORY) as maxmem 
     from service_performance 
     group by service_id 
     ) sp 
     on s.service_id = sp.service_id 
    set s.MAX_VALUE = sp.maxmem; 

Ваша версия будет работать, если ему имели правильное имя таблицы в where пунктах:

update services 
    set MAX_VALUE = (SELECT MAX(AVERAGE_MEMORY) AS SERVICE_ID 
        FROM service_performance 
        WHERE `services`.`SERVICE_ID` = `service_performance`.`SERVICE_ID`) 
    where exists (select * 
        from service_performance 
        where `services`.`SERVICE_ID` = `service_performance`.`SERVICE_ID` 
       ); 

Я предполагаю, что update _services опечатка и должно быть действительно update services.

+0

спасибо всем. Я получил его для работы с этой второй версией (и да, у меня была опечатка, когда я набрал свой запрос здесь с дополнительным _ – user3535795

0

MySQL жалуется, потому что в этом запросе нет service_performance таблица

Попробуйте так:

UPDATE _services s INNER JOIN service_performance p 
    ON s.SERVICE_ID=p.SERVICE_ID 
    SET s.MAX_VALUE=MAX(p.AVERAGE_MEMORY) GROUP BY p.SERVICE_ID 
0

не имеют базу данных для тестирования, но, во-первых, вы не дали подзапрос псевдонима, поэтому он не знает, что такое service_performance.Service_ID.

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

update _services 
set MAX_VALUE = (SELECT MAX(AVERAGE_MEMORY) AS SERVICE_ID FROM service_performance 
       INNER JOIN 
       services 
       on services.SERVICE_ID = service_performance.SERVICE_ID) 
Смежные вопросы