2013-01-07 42 views
0

我有一個更新語句,我想在一個語句中執行,但是我發現它有點棘手。更新子查詢中的未知列

表格記錄目標隨時間的變化。

例如,從1月1日到31日,目標可以是100,然後是從110年2月1日到28日,然後是從120年3月1日到31日,依此類推。

用戶只輸入金額和date_from。每次記錄被刪除,更新或插入新記錄後,都會重新計算每個記錄的date_to。它拾取的值是day_from最小day_from大於當前記錄的day_from的記錄的day_from前一天。既然不能想辦法讓它多一點清楚,這裏有幾個例子:

From   To   Amount 
1st Jan   31st Jan  100 
1st Feb   28th Feb  110 
1st Mar   31st Mar  120 
... 
... 

如果我插入帶有簡和值= 105 date_from 15日的記錄,我想記錄1月1日將date_to更新爲1月14日,並且插入的日期更新至1月31日

刪除2月1日的記錄將具有新插入記錄的新記錄的date_to從一月三十一日改爲三月二十八日。

我希望它解釋了我想要做的很清楚。

現在,這裏是我的SQL,這是不行的

以下回報:

錯誤代碼:1093您不能指定目標表「ptcth1」的更新在FROM子句在「where子句」

未知列「ptcth1.date_from」:

update personal_trainer_client_target_history ptcth1 set date_to = 
(
    select min(date_from) from personal_trainer_client_target_history ptcth2 
    where ptcth2.date_from > ptcth1.date_from 
) 

當我試圖糾正它像這樣,我得到=>錯誤代碼

update personal_trainer_client_target_history ptcth1 set date_to = 
(
    select date_from from 
    (
    select min(date_from) from personal_trainer_client_target_history ptcth2 
    where ptcth2.date_from > ptcth1.date_from 
) 
    as temp_table 
) 

任何想法?

回答

1
DROP TABLE IF EXISTS my_table; 

    CREATE TABLE my_table (from_date DATE NOT NULL PRIMARY KEY,Amount INT NOT NULL); 

    INSERT INTO my_table VALUES 
    ('2013-01-01',100), 
    ('2013-02-01',110), 
    ('2013-03-01',120); 

    SELECT x.from_date 
     , MIN(y.from_date) - INTERVAL 1 DAY to_date 
     , x.amount 
     FROM my_table x 
     LEFT 
     JOIN my_table y 
     ON y.from_date > x.from_date 
    GROUP 
     BY x.from_date; 
    +------------+------------+--------+ 
    | from_date | to_date | amount | 
    +------------+------------+--------+ 
    | 2013-01-01 | 2013-01-31 | 100 | 
    | 2013-02-01 | 2013-02-28 | 110 |  
    | 2013-03-01 | NULL  | 120 | 
    +------------+------------+--------+ 

    INSERT INTO my_table VALUES ('2013-01-15',105); 

    SELECT x.from_date 
     , MIN(y.from_date) - INTERVAL 1 DAY to_date 
     , x.amount 
     FROM my_table x 
     LEFT 
     JOIN my_table y 
     ON y.from_date > x.from_date 
    GROUP 
     BY x.from_date; 
    +------------+------------+--------+ 
    | from_date | to_date | amount | 
    +------------+------------+--------+ 
    | 2013-01-01 | 2013-01-14 | 100 | 
    | 2013-01-15 | 2013-01-31 | 105 | 
    | 2013-02-01 | 2013-02-28 | 110 | 
    | 2013-03-01 | NULL  | 120 | 
    +------------+------------+--------+ 
+0

我不敢相信我沒有想到這一點!我非常關注如何將價值放在桌面上,以至於任何其他解決方案甚至沒有跨過我的想法。非常感謝您的快速回復! – Dan