子查询中的未知列用于更新

时间:2013-01-07 15:07:30

标签: mysql sql-update

我有一个更新声明,我想在一个声明中做,但我发现它有点棘手。

表格记录目标随时间的变化。

例如,从1月1日到31日,目标可以是100,然后是110年2月1日到28日,然后是120年3月1日到31日,依此类推。

用户只输入金额和date_from。每次删除,更新记录或插入新记录后,都会重新计算每条记录的date_to。它获取的值是记录的day_from前一天,最小day_from大于当前记录的day_from。由于我想不出一种让它更清晰的方法,这里有几个例子:

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

如果我使用date_from 1月15日和值= 105插入记录,我希望1月1日的记录将date_to更新到1月14日,插入的记录将date_to更新到1月31日

删除2月1日的记录会使新插入记录的新记录的date_to从1月31日更改为3月28日。

我希望它能够清楚地解释我要做的事情。

现在,这是我的SQL,它不起作用

以下内容返回:

  

错误代码:1093。您无法在FROM子句中为更新指定目标表'ptcth1'

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
)

当我尝试像这样纠正时,我得= =>错误代码:1054。'where子句'

中的未知列'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 个答案:

答案 0 :(得分: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 |
    +------------+------------+--------+