微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Code First 迁移 - SQL 更新列包含同一表中另一行的数据

如何解决Code First 迁移 - SQL 更新列包含同一表中另一行的数据

情况:

给出下表:

ID 价格 ProductId ValidFrom
1 1,00 1 01-01-01
2 1,00 1 01-01-15
3 1,00 1 01-02-01
4 1,00 2 01-01-01
5 1,00 2 01-01-11
6 1,00 2 01-01-28
7 1,00 2 01-02-01
8 1,00 2 01-01-08

现在我想在表格中添加一个新列“ValidUntil”。因为数据已经存在,所以应该为现有条目预填充新列。

更改后的表格应如下所示:

ID 价格 ProductId ValidFrom 有效期至
1 1,00 1 01-01-01 01-01-15
2 1,00 1 01-01-15 01-02-01
3 1,00 1 01-02-01
4 1,00 2 01-01-01 01-01-11
5 1,00 2 01-01-11 01-01-28
6 1,00 2 01-01-28 01-02-01
7 1,00 2 01-02-01 01-02-08
8 1,00 2 01-02-08

我使用 Entity Framework Core Code First Migration 来更新数据。

问题:

我首先重命名该列,然后使用以下行预填充该列:

migrationBuilder.sql("UPDATE Prices p1 SET p1.ValidUntil = (SELECT TOP 1 ValidFrom FROM Prices p2 WHERE p2.ValidFrom > p1.ValidFrom ORDER BY DATEDIFF(day,p2.ValidFrom,p1.ValidFrom))");

运行更新时出现以下错误

'p1' 附近的语法不正确。

ORDER-Keyword 附近的语法不正确。

问题:

我对 sql 语句的经验较少,因此如果您能帮助我了解此语句有什么问题,我将不胜感激。

另外,如果有人有更适合这种情况的陈述,也欢迎他。

感谢您的帮助。

解决方法

您可以使用 lead() 获取截止日期:

select p.*,lead(validfrom) over (partition by productid order by validfrom) as validuntil
from prices p;

在 SQL Server 中,您可以将其合并到 update 中:

with toupdate as (
      select p.*,lead(validfrom) over (partition by productid order by validfrom) as new_validuntil
      from prices p
     )
update toupdate
    set validuntil = new_validuntil
    where new_validuntil is not null;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。