我的 UPDATE 语句哪里不存在有什么问题?
What is wrong with my UPDATE statement WHERE NOT EXISTS?
我想要完成的是将 ISCURRENT
字段更新为 'N'
并将 EFFECTIVE_END_DATE
字段更新为当前日期,如果其类型的记录没有最多最近 EFFECTIVE_START_DATE
.
不会抛出错误,它只是告诉我“受影响的 0 行”,但我创建了一个具有较新 EFFECTIVE_START_DATE
的记录,该记录应该会影响 table 中具有较早 EFFECTIVE_START_DATE
的另一条记录].
这是我用来测试它的 2 条记录的图像。
KTEXT
为“400 Atlantic”的记录应从此脚本更改为具有 ISCURRENT ='N'
和 EFFECTIVE_END_DATE=GETDATE()
,因为带有 KTEXT
的记录500 Maria
有一个更新的 EFFECTIVE_START_DATE
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]);
谢谢!
如果我错了请纠正我,但这部分查询
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
)
如果我没理解错的话,语句应该是这样的:
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
);
我想要完成的是将 ISCURRENT
字段更新为 'N'
并将 EFFECTIVE_END_DATE
字段更新为当前日期,如果其类型的记录没有最多最近 EFFECTIVE_START_DATE
.
不会抛出错误,它只是告诉我“受影响的 0 行”,但我创建了一个具有较新 EFFECTIVE_START_DATE
的记录,该记录应该会影响 table 中具有较早 EFFECTIVE_START_DATE
的另一条记录].
这是我用来测试它的 2 条记录的图像。
KTEXT
为“400 Atlantic”的记录应从此脚本更改为具有 ISCURRENT ='N'
和 EFFECTIVE_END_DATE=GETDATE()
,因为带有 KTEXT
的记录500 Maria
有一个更新的 EFFECTIVE_START_DATE
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]);
谢谢!
如果我错了请纠正我,但这部分查询
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
)
如果我没理解错的话,语句应该是这样的:
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
);