Sql 在两个没有重复项的表之间传输记录
我在一个名为Sql 在两个没有重复项的表之间传输记录,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我在一个名为CENSUS(列:APN,ATTRIB\u VALUE,ATTNAME)的表中有数据,需要传输到名为PARCEL\u ATTR(列:L1\u PARCEL\u NBR,L1\u ATTRIB\u VALUE,L1\u ATTRIB\u NAME)的表中 地块属性的主键是两列L1地块属性和L1地块属性名 我尝试使用以下SQL语句将记录从普查插入地块属性,但未成功: INSERT INTO dbo.PARCEL_ATTR (L1_PARCEL_NBR, L1_ATTRIB_VALUE,
CENSUS
(列:APN,ATTRIB\u VALUE,ATTNAME
)的表中有数据,需要传输到名为PARCEL\u ATTR
(列:L1\u PARCEL\u NBR,L1\u ATTRIB\u VALUE,L1\u ATTRIB\u NAME
)的表中
地块属性
的主键是两列L1地块属性
和L1地块属性名
我尝试使用以下SQL语句将记录从普查
插入地块属性
,但未成功:
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收到此错误:
违反主键约束“PKparcel_attr”。无法在对象“dbo.Parcel\u Attr”中插入重复键。重复的键值为(002-001-021,普查)
有人能帮我理解我做错了什么吗?请尝试以下方法:
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
我希望它能有所帮助。您只是在过滤
包裹属性表中已经存在的记录。但是您没有删除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;