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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...