【问题标题】:Insert missing records插入缺失的记录
【发布时间】:2013-12-26 18:07:18
【问题描述】:

我有一个 sql server 2008 r2 表,其中包含数千条已由单独程序更新的记录。由于疏忽,有一系列缺失的记录。我需要将丢失的记录插入数据库。如果记录存在(ANumber 和 Stage 与可能丢失记录的表匹配)则转到下一条记录,如果不存在则插入记录(ANumber、Stage、field3 到 field10。)

我想做的是首先创建缺失记录表(字段 1 -10)。将表命名为 tbMissRec。我现有的表是 MstrAnno。

这是我不确定语法的地方。我见过合并命令,但我想到的是那种逻辑

If (tbMissRec.ANumber = MstrAnno.ANumber) and (tbMissRec.Stage =
MstrAnno.Stage) then Else insert into MstrAnno
tbMissRec.ANumber,tbMissRec.Stage, etc)

我确信这不是正确的语法,但我认为逻辑很明显。

如果记录不存在,我只需要插入。

【问题讨论】:

  • 您能否添加一些数据样本,说明您拥有什么以及想要获得什么?
  • 请澄清。您是否要填充表 tbMissRec?如果是这样,您尝试从哪里获取数据?
  • 我正在尝试更新表 MstrAnno。该表缺少一个月前完成的导入过程中的数据。我正在尝试返回记录并更新缺少数据的表。表中有 35K 条记录,我有 8K 条记录发生在我们试图修复的日期范围内。只有与 ANumber 和 Stage 不匹配的记录才需要插入到表中。
  • 这是我尝试的代码 INSERT INTO MasterAnnotation SELECT A.[AdDate],A.Page_ID,A.Status,A.[AnnotationNumber],A.[AnnotationBy],A.[RoleDescription] ,A.[AnnotationDate],A.[AnnotationType],A.[BusinessUnit],A.[ActualAgencyError],A.[ErrorType],A.[AnnotationComments],A.[TeamComments],A.Client,A.Activity FROM dbo.MissRec A LEFT JOIN MasterAnnotation B ON B.AnnotationNumber = A.[AnnotationNumber] AND B.AnnotationDate = A.[AnnotationDate] WHERE B.AnnotationNumber IS NULL
  • 我发现了问题。我需要在 insert into 语句中定义列名。一旦我这样做了,插入就会发生。

标签: sql sql-server-2008 sql-insert


【解决方案1】:

应该这样做:

INSERT INTO MstrAnno
SELECT *
FROM tbMissRec A
WHERE NOT EXISTS(SELECT 1 FROM MstrAnno
                 WHERE ANumber = A.ANumber 
                 AND Stage = A.Stage)

【讨论】:

    【解决方案2】:

    我更喜欢这种格式,因为它很容易注释掉插入内容并验证要插入的数据。此外,您应该在插入和选择中指定列名。

    INSERT INTO MstrAnno (ANumber,Stage)
        SELECT A.ANumber,A.Stage
        FROM tbMissRec A
        LEFT JOIN MstrAnno B ON B.ANumber = A.ANumber AND B.Stage = A.Stage
        WHERE B.ANumber IS NULL
    

    【讨论】:

    • 如果你要讲指定列名,你不应该自己选择*。
    • @DanBracuk 看到原始问题没有指定所有列,我不知道我该怎么做,除非“etc”是列名......更新都一样.
    • INSERT INTO MasterAnnotation SELECT A.[AdDate],A.Page_ID,A.Status,A.[AnnotationNumber],A.[AnnotationBy],A.[RoleDescription],A.[AnnotationDate], A.[AnnotationType],A.[BusinessUnit],A.[ActualAgencyError],A.[ErrorType],A.[AnnotationComments],A.[TeamComments],A.Client,A.Activity FROM dbo.MissRec A LEFT JOIN MasterAnnotation B ON B.AnnotationNumber = A.[AnnotationNumber] AND B.AnnotationDate = A.[AnnotationDate] WHERE B.AnnotationNumber IS NULL 我收到错误 Column Name or number does not match definition?
    • 发现问题。我需要在 insert into 语句中定义列名。一旦我这样做了,一切都很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多