2014-02-12 34 views
1

我有這樣的一個表:更新數據設定特定日期的最低計時活動

表:activity

Date   Time  task_name type 
10-02-2014 07:00  Reporting Scheduled 
10-02-2014 1200  mailing Failed 
10-02-2014 16:00  Checking Scheduled 
11-02-2014 10:00  DDDD  Done 

我想更新從Scheduled命名typeDone特定列那天的時間最少的日期。 下面有查詢:

UPDATE activity 
SET type = "Done" 
WHERE 
    type = "Scheduled" 
    AND Date = "10-02-2014" 
    AND time = (SELECT MAX(time) FROM activity WHERE Date = '10-02-2014'); 

但它拋出一個錯誤:

ERROR 1093 (HY000): You can't specify target table 'activity' for update in FROM clause

+2

你使用哪種RDBMS? – hkutluay

+0

請注意,MySQL中的日期應該使用DATE數據類型 - 否則,爲什麼要麻煩。 – Strawberry

回答

0

人們不談論一半些廢話這裏。考慮以下...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
, type VARCHAR(12) NOT NULL 
); 

INSERT INTO my_table (type) VALUES 
('scheduled'),('failed'),('scheduled'),('done'); 

UPDATE my_table x 
    LEFT 
    JOIN my_table y 
    ON y.id < x.id 
    SET x.type = 'done' 
WHERE y.id IS NULL; 

SELECT * FROM my_table; 
+----+-----------+ 
| id | type  | 
+----+-----------+ 
| 1 | done  | 
| 2 | failed | 
| 3 | scheduled | 
| 4 | done  | 
+----+-----------+ 

僅通過實例的方式,這是一個使用子查詢一些代碼 - 儘管是不相關的一個...

UPDATE my_table x 
    JOIN (SELECT MIN(id) minid FROM my_table) y 
    ON y.minid = x.id 
    SET x.type = 'done'; 
+0

但我不更新minid。我想更新一下那段時間最少的時間。 – Basudev

+0

我只是在展示一個原則。根據你的目的調整這個查詢是(或者至少是'應該')微不足道的! – Strawberry

+0

非常感謝你..... – Basudev

0

能否請您試試這個:

update activity 
set type='Done' 
where date='10-2-2014' and type='scheduled' and time in (select MIN(time) from activity where date='10-2-2014')  

這完全是爲我工作。 我使用SQL Server 2008中

希望這有助於..

+0

錯誤1054(42S22):'字段列表'中的未知列'time1' – Basudev

+0

@ Basudev ..更新了答案,根據您的表,tehe列的名稱是time time1 ..請檢查.. –

+0

again同樣的錯誤找到。我使用PHP myadmin的默認database.ERROR 1093(HY000):你不能指定目標表的'活動'在FROM子句 – Basudev

1

因爲MySQL的documented limitation的,你不能用同一個表兩個子查詢FROM子句和更新目標表。

然後,您應該做這樣的事情:

DECLARE @minTime time 
SELECT @minTime = MIN(time) FROM activity WHERE date='10-2-2014' 

UPDATE activity 
SET type='Done' 
WHERE date='10-2-2014' AND type='scheduled' AND time = @minTime