【发布时间】:2021-05-26 20:12:55
【问题描述】:
我想要完成的是将ISCURRENT 字段更新为'N',如果其类型的记录没有最新的EFFECTIVE_START_DATE,则将EFFECTIVE_END_DATE 字段更新为当前日期。
不会抛出错误,它只是告诉我“0 行受影响”,但我创建了一条更新的 EFFECTIVE_START_DATE 记录,这应该会影响表中具有较早 EFFECTIVE_START_DATE 的另一条记录。
这是我用来测试的 2 条记录的图像。
应将此脚本中具有“400 Atlantic”的KTEXT 的记录更改为具有ISCURRENT ='N' 和EFFECTIVE_END_DATE=GETDATE(),因为具有500 Maria 的KTEXT 的记录具有更新的@987654335 @
UPDATE [SAP].[src_gl_sap_m_cepct]
set ISCURRENT='N',
EFFECTIVE_END_DATE=GETDATE()
WHERE NOT EXISTS (SELECT [SPRAS],
[PRCTR],
MAX(EFFECTIVE_START_DATE)
FROM [SAP].[src_gl_sap_m_cepct] AS A
WHERE CONCAT([SAP].[src_gl_sap_m_cepct].[SPRAS],[SAP].[src_gl_sap_m_cepct].[PRCTR]) = CONCAT(A.[SPRAS],A.[PRCTR]
)
GROUP BY [SPRAS],[PRCTR]);
谢谢!
【问题讨论】:
-
您是否收到错误消息?还是没有更新?这里似乎有什么问题?
-
对不起 - 我更新了描述我没有收到错误它只是说“0行受影响”但应该有一行受到影响我试图放置示例数据的屏幕截图
-
@mb1002 - 样本数据的屏幕截图没有用 - 我们不需要转录/打字练习。请添加示例数据(最好格式化为
INSERT语句)作为文本,我们可以将其复制并粘贴到我们的数据库中以重新创建问题。 -
如果没有行受到影响,那么您的
WHERE将导致没有行。将UPDATE语句更改为具有相同条件的SELECTstateemnt,您将不会得到任何行。还有来自 SQL Server 的3+ part naming is due to be deprecated;坚持为您的对象设置别名并使用该别名来限定您的列。它也会使代码更加简洁。 -
@mb1002 请感谢将您的代码文本墙变成可读内容的人。那应该是你做的事情。我们对您的架构和用于匹配目的的逻辑键一无所知。当您的表和列名称含糊不清并且您将列连接在一起以进行关联时,就更难理解了。这在逻辑上是错误且效率低下的 - 直接加入列。
标签: sql-server sql-update not-exists