2014-11-17 136 views
1

我有一個數據庫有兩個表: 「服務」和「service_performance」 這兩個表有一個SERVICE_ID列。MySQL更新列值與另一列的最大值

在「服務」中,SERVICE_ID值是唯一的(每個服務都有一個ID /條目)。 在「service_performance」有每service_id爲

我試圖更新「服務」表從「service_performance」表中獲取的最高AVERAGE_MEMORY值MAX_VALUE列多個條目的AVERAGE_MEMORY列。

我知道我的查詢是錯誤的,因爲它拋出一個錯誤:

1054 - 中未知列'service_performance.SERVICE_ID 'where子句'

雖然 '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)