我在名为CENSUS
(列:APN, ATTRIB_VALUE, ATTNAME
)的表中有数据,需要将其传输到名为PARCEL_ATTR
的表(列:L1_PARCEL_NBR, L1_ATTRIB_VALUE, L1_ATTRIB_NAME
)。
PARCEL_ATTR
的主键是两列L1_PARCEL_NBR
和L1_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 :(得分: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
我希望它有所帮助。