2015-01-05 54 views
1

我在名爲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,人口普查)。

任何人都可以幫我理解我做錯了什麼嗎?

回答

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 

我希望它可以幫助一些方式。

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;