如何将“不存在”添加到我的 SQL 查询中?

问题描述 投票:0回答:1

如果表(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”。

我不断在目标表中收到重复的行。

sql duplicates not-exists
1个回答
0
投票

如果没有通过唯一键进行匹配,您必须决定在比较每个表中的行时要包括哪些列。例如,以下内容将识别新表中现有表中不存在的行:

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(新)。

© www.soinside.com 2019 - 2024. All rights reserved.