我有一个更新声明,我想在一个声明中做,但我发现它有点棘手。
表格记录目标随时间的变化。
例如,从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
)
有什么想法吗?
答案 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 |
+------------+------------+--------+