【问题标题】:What is wrong with my UPDATE statement WHERE NOT EXISTS?我的 UPDATE 语句 WHERE NOT EXISTS 有什么问题?
【发布时间】: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 MariaKTEXT 的记录具有更新的@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 语句更改为具有相同条件的SELECT stateemnt,您将不会得到任何行。还有来自 SQL Server 的3+ part naming is due to be deprecated;坚持为您的对象设置别名并使用该别名来限定您的列。它也会使代码更加简洁。
  • @mb1002 请感谢将您的代码文本墙变成可读内容的人。那应该是你做的事情。我们对您的架构和用于匹配目的的逻辑键一无所知。当您的表和列名称含糊不清并且您将列连接在一起以进行关联时,就更难理解了。这在逻辑上是错误且效率低下的 - 直接加入列。

标签: sql-server sql-update not-exists


【解决方案1】:

如果我错了,请纠正我,但这部分是你的查询

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]

也可以这样写(因为你有self join)

FROM  [SAP].[src_gl_sap_m_cepct] AS A 
WHERE CONCAT(A.[SPRAS], A.[PRCTR]) = CONCAT(A.[SPRAS], A.[PRCTR]

像这样,我注意到您只是再次将一个值与相同的值进行比较。
因此,这将始终评估为 TRUE
因此not exists 子句永远不会评估为true
因此不会发生更新。

我认为这样的事情可能对你有用

UPDATE c
set    c.ISCURRENT='N', 
       c.EFFECTIVE_END_DATE = GETDATE()
FROM   SAP.src_gl_sap_m_cepct c
WHERE  EXISTS ( select 1
                FROM   SAP.src_gl_sap_m_cepct AS A
                WHERE  CONCAT(c.SPRAS, c.PRCTR) = CONCAT(A.SPRAS, A.PRCTR)
                AND    A.EFFECTIVE_START_DATE > c.EFFECTIVE_START_DATE
              )

【讨论】:

  • 没问题,很高兴我能帮上忙。
【解决方案2】:

如果我理解正确的话,语句应该是这样的:

UPDATE c
set    ISCURRENT='N', 
       EFFECTIVE_END_DATE = GETDATE()
FROM [SAP].[src_gl_sap_m_cepct] c
WHERE EXISTS (
        SELECT 1 
        FROM  [SAP].[src_gl_sap_m_cepct] AS A 
        WHERE CONCAT(c.[SPRAS], c.[PRCTR]) = CONCAT(A.[SPRAS],A.[PRCTR])
            AND c.EFFECTIVE_START_DATE < A.EFFECTIVE_START_DATE 
);

【讨论】:

  • 不幸的是,这仍然返回“0行受影响”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2018-01-28
  • 1970-01-01
  • 2012-11-03
  • 2021-01-14
相关资源
最近更新 更多