合并条件在 sql 服务器中不起作用
merge condition is not working in sql server
我有两个表,一个是 (providerLoc),另一个是 (tmpProviderLoc) 我需要从 tmpProviderLoc 中获取三列组合,并且需要检查 ProviderLoc 中是否存在记录
情况 1:如果 providerLoc 中存在记录,我需要根据 tmpProviderLoc 中的列 (npi) 更新 providerLoc 中的另一列 (Npi)
情况 2:如果不存在,我需要在 providerLoc
中插入值
为此我在下面写了查询:
MERGE INTO [dbo].[ProviderLoc] AS PL
USING
(
select *
from (
select *,
row_number() over (partition by [Location_ID],[PProviderTaxID]
,[POBOXZIP] order by [Location_ID],[PProviderTaxID],[POBOXZIP]) as row_number
from [dbo].[TmpProviderLoc]
) as rows
where row_number = 1
) AS TPL
ON TPL.[Location_ID] = PL.[ecProviderID]
AND TPL.[PProviderTaxID] = PL.[TaxID]
AND TPL.[NPI] = PL.[NPI]
AND TPL.[POBOXZIP] = PL.[POBOXZIP]
WHEN MATCHED THEN
UPDATE SET PL.[NPI] = CASE
WHEN TPL.[NPI] = NULL THEN PL.[NPI]
ELSE TPL.[NPI]
END
WHEN NOT MATCHED THEN
INSERT (EcProviderID,TaxID,NPI,POBOXZIP,ProviderLocationStatusID,CreatedON)
VALUES (TPL.[Location_ID],TPL.[PProviderTaxID],TPL.[NPI]
,TPL.[POBOXZIP],1,GETDATE());
但我无法更新 NPI 值——如果 npi 值在 tmpProviderLoc 中是新的,它不会在 ProviderLoc 中更新..
任何人都可以调查一下这个问题..
或任何其他方式进行这种检查
这里的等号是错误的:WHEN TPL.[NPI] = NULL THEN PL.[NPI]
使用IS NULL
WHEN TPL.[NPI] IS NULL THEN PL.[NPI]
NULL 是特殊的。它们是 "indeterminate",所以它们不能等于或不等于任何东西,纯粹是因为它们不能有任何值 "determined"。 NULL 表示没有值,equal/unequal 不适用。
要发现 NULL 是否存在,请使用 IS NULL - 或 - IS NOT NULL 来发现是否存在非空值。
我有两个表,一个是 (providerLoc),另一个是 (tmpProviderLoc) 我需要从 tmpProviderLoc 中获取三列组合,并且需要检查 ProviderLoc 中是否存在记录
情况 1:如果 providerLoc 中存在记录,我需要根据 tmpProviderLoc 中的列 (npi) 更新 providerLoc 中的另一列 (Npi)
情况 2:如果不存在,我需要在 providerLoc
中插入值为此我在下面写了查询:
MERGE INTO [dbo].[ProviderLoc] AS PL
USING
(
select *
from (
select *,
row_number() over (partition by [Location_ID],[PProviderTaxID]
,[POBOXZIP] order by [Location_ID],[PProviderTaxID],[POBOXZIP]) as row_number
from [dbo].[TmpProviderLoc]
) as rows
where row_number = 1
) AS TPL
ON TPL.[Location_ID] = PL.[ecProviderID]
AND TPL.[PProviderTaxID] = PL.[TaxID]
AND TPL.[NPI] = PL.[NPI]
AND TPL.[POBOXZIP] = PL.[POBOXZIP]
WHEN MATCHED THEN
UPDATE SET PL.[NPI] = CASE
WHEN TPL.[NPI] = NULL THEN PL.[NPI]
ELSE TPL.[NPI]
END
WHEN NOT MATCHED THEN
INSERT (EcProviderID,TaxID,NPI,POBOXZIP,ProviderLocationStatusID,CreatedON)
VALUES (TPL.[Location_ID],TPL.[PProviderTaxID],TPL.[NPI]
,TPL.[POBOXZIP],1,GETDATE());
但我无法更新 NPI 值——如果 npi 值在 tmpProviderLoc 中是新的,它不会在 ProviderLoc 中更新..
任何人都可以调查一下这个问题.. 或任何其他方式进行这种检查
这里的等号是错误的:WHEN TPL.[NPI] = NULL THEN PL.[NPI]
使用IS NULL
WHEN TPL.[NPI] IS NULL THEN PL.[NPI]
NULL 是特殊的。它们是 "indeterminate",所以它们不能等于或不等于任何东西,纯粹是因为它们不能有任何值 "determined"。 NULL 表示没有值,equal/unequal 不适用。
要发现 NULL 是否存在,请使用 IS NULL - 或 - IS NOT NULL 来发现是否存在非空值。