【问题标题】:Code First Migration - SQL Update column with data from another row in same tableCode First Migration - SQL 更新列,其中包含同一表中另一行的数据
【发布时间】:2021-06-10 12:21:22
【问题描述】:

情况:

如下表:

Id Price 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 Price ProductId ValidFrom ValidUntil
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 语句的经验较少,因此如果能帮助我理解该语句的问题,我将不胜感激。

另外,如果有人有更适合本案的陈述,也欢迎他。

感谢您的帮助。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 哦,对不起。当然。

标签: sql sql-server entity-framework-core sql-update ef-code-first


【解决方案1】:

您可以使用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;

【讨论】:

  • 太棒了!感谢您的快速响应和大力帮助。为我工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多