在两个表之间传输记录,没有重复

时间:2015-01-05 21:54:35

标签: sql sql-server tsql sql-server-2008-r2

我在名为CENSUS(列:APN, ATTRIB_VALUE, ATTNAME)的表中有数据,需要将其传输到名为PARCEL_ATTR的表(列:L1_PARCEL_NBR, L1_ATTRIB_VALUE, L1_ATTRIB_NAME)。

PARCEL_ATTR的主键是两列L1_PARCEL_NBRL1_ATTRIB_NAME

我尝试使用以下SQL语句将CENSUS中的记录插入PARCEL_ATTR但未成功:

INSERT INTO dbo.PARCEL_ATTR (L1_PARCEL_NBR, L1_ATTRIB_VALUE, L1_ATTRIB_NAME) 
    SELECT 
        APN, ATTRIB_VALUE, ATTNAME 
    FROM 
        dbo.CENSUS 
    WHERE 
        NOT EXISTS (SELECT 1 
                    FROM PARCEL_ATTR 
                    WHERE CENSUS.APN = PARCEL_ATTR.L1_PARCEL_NBR 
                      AND CENSUS.ATTNAME = PARCEL_ATTR.L1_ATTRIB_NAME);

我每次都从SQL Server 2008 R2收到此错误:

  

违反PRIMARY KEY约束'PKparcel_attr'。无法在对象'dbo.Parcel_Attr'中插入重复键。重复键值为(002-001-021,人口普查)。

任何人都可以帮我理解我做错了吗?

2 个答案:

答案 0 :(得分:1)

您只过滤PARCEL_ATTR表中已存在的记录。但您错过了删除CENSUS表中的重复项。

使用Window Function删除CENSUS表中的重复项。试试这个。

INSERT INTO dbo.PARCEL_ATTR
            (L1_PARCEL_NBR,
             L1_ATTRIB_VALUE,
             L1_ATTRIB_NAME)
SELECT APN,
       ATTRIB_VALUE,
       ATTNAME
FROM   (SELECT Row_number()OVER (partition BY APN, ATTNAME ORDER BY ATTRIB_VALUE) rn,
               APN,
               ATTRIB_VALUE,
               ATTNAME
        FROM   dbo.CENSUS
        WHERE  NOT EXISTS (SELECT 1
                           FROM   PARCEL_ATTR
                           WHERE  CENSUS.APN = PARCEL_ATTR.L1_PARCEL_NBR
                                  AND CENSUS.ATTNAME = PARCEL_ATTR.L1_ATTRIB_NAME))A
WHERE  rn = 1; 

答案 1 :(得分:0)

请尝试以下方法:

INSERT INTO dbo.PARCEL_ATTR (L1_PARCEL_NBR, L1_ATTRIB_VALUE, L1_ATTRIB_NAME) 
SELECT CENSUS.APN, CENSUS.ATTRIB_VALUE, CENSUS.ATTNAME 
FROM dbo.CENSUS 
     LEFT OUTER JOIN PARCEL_ATTR AS A 
     ON CENSUS.APN=A.L1_PARCEL_NBR AND CENSUS.ATTNAME=A.L1_ATTRIB_NAME)
WHERE
     A.L1_PARCEL_NBR IS NULL

我希望它有所帮助。