如果表(t)中不存在,我需要从临时表(temp)中插入一个新行。我遇到的问题是没有主键,并且临时表在每次导入时都会被截断。我正在使用存储过程将数据从 temp 合并到 t,但我只想导入不存在的行。我在插入查询开始时尝试过:
IF NOT EXISTS (SELECT *
FROM FPS.Predictive_Acquisition_Cost_NEW sa
LEFT JOIN FPS_LZ.FPS.Predictive_Acquisition_Cost lz
ON lz.Drug_Identifier = sa.Drug_Identifier
WHERE sa.Drug_Identifier = lz.Drug_Identifier
AND lz.Effective_Date <> sa.Effective_Date)
在插入查询的末尾:
WHERE NOT EXISTS(SELECT * FROM FPS.Predictive_Acquisition_Cost_NEW)
完整插入查询以获得更好的参考:
--IF NOT EXISTS (SELECT * FROM FPS.Predictive_Acquisition_Cost_NEW sa LEFT JOIN FPS_LZ.FPS.Predictive_Acquisition_Cost lz ON lz.Drug_Identifier = sa.Drug_Identifier WHERE sa.Drug_Identifier = lz.Drug_Identifier AND lz.Effective_Date <> sa.Effective_Date)
INSERT INTO FPS_SA.FPS.Predictive_Acquisition_Cost_NEW
(
Drug_Identifier,
Identifier_Type,
Drug_Group,
Brand_Generic,
PAC,
PAC_Low,
PAC_High,
PAC_Retail,
Error_Code,
Effective_Date,
End_Date,
PAC_Model_Version
)
SELECT lz.Drug_Identifier,
lz.Identifier_Type,
lz.Drug_Group,
lz.Brand_Generic,
lz.PAC,
lz.PAC_Low,
lz.PAC_High,
lz.PAC_Retail,
lz.Error_Code,
lz.Effective_Date,
lz.End_Date,
lz.PAC_Model_Version
FROM FPS_LZ.fps.Predictive_Acquisition_Cost lz LEFT OUTER JOIN FPS_SA.FPS.Predictive_Acquisition_Cost sa ON lz.Drug_Identifier = sa.Drug_Identifier`
--WHERE NOT EXISTS(SELECT * FROM FPS.Predictive_Acquisition_Cost_NEW)
我在查询开头尝试了“IF NOT EXISTS”和/或在查询末尾尝试了“WHERE NOT EXISTS”。
我不断在目标表中收到重复的行。
如果没有通过唯一键进行匹配,您必须决定在比较每个表中的行时要包括哪些列。例如,以下内容将识别新表中现有表中不存在的行:
SELECT
t.*
FROM FPS.Predictive_Acquisition_Cost_NEW t
WHERE NOT EXISTS(SELECT NULL
FROM FPS_LZ.fps.Predictive_Acquisition_Cost lz
WHERE lz.Drug_Identifier = t.Drug_Identifier
AND lz.Identifier_Type = t.Identifier_Type
AND lz.Drug_Group = t.Drug_Group
AND lz.Brand_Generic = t.Brand_Generic
AND lz.PAC = t.PAC
AND lz.PAC_Low = t.PAC_Low
AND lz.PAC_High = t.PAC_High
AND lz.PAC_Retail = t.PAC_Retail
AND lz.Error_Code = t.Error_Code
AND lz.Effective_Date = t.Effective_Date
AND lz.End_Date = t.End_Date
AND lz.PAC_Model_Version = t.PAC_Model_Version
)
相反,识别现有表中不存在于新表中的行,只需调整表引用:
SELECT
lz.*
FROM FPS_LZ.fps.Predictive_Acquisition_Cost lz
WHERE NOT EXISTS(SELECT NULL
FROM FPS.Predictive_Acquisition_Cost_NEW t
WHERE lz.Drug_Identifier = t.Drug_Identifier
AND lz.Identifier_Type = t.Identifier_Type
AND lz.Drug_Group = t.Drug_Group
AND lz.Brand_Generic = t.Brand_Generic
AND lz.PAC = t.PAC
AND lz.PAC_Low = t.PAC_Low
AND lz.PAC_High = t.PAC_High
AND lz.PAC_Retail = t.PAC_Retail
AND lz.Error_Code = t.Error_Code
AND lz.Effective_Date = t.Effective_Date
AND lz.End_Date = t.End_Date
AND lz.PAC_Model_Version = t.PAC_Model_Version
)
要点是,要使用
NOT EXISTS(subquery)
,子查询必须包含比较两个表中的值的谓词。特别注意 where 子句中的每个谓词如何引用 lz(现有)和 t(新)。