Reputation: 11
I have data in a table named CENSUS
(columns: APN, ATTRIB_VALUE, ATTNAME
) that needs to be transferred to a table named PARCEL_ATTR
(columns: L1_PARCEL_NBR, L1_ATTRIB_VALUE, L1_ATTRIB_NAME
).
PARCEL_ATTR
's primary key is two columns L1_PARCEL_NBR
and L1_ATTRIB_NAME
.
I have tried to use the following SQL statement to insert records from CENSUS
into PARCEL_ATTR
without success:
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);
I get this error from SQL Server 2008 R2 every time:
Violation of PRIMARY KEY constraint 'PKparcel_attr'. Cannot insert duplicate key in object 'dbo.Parcel_Attr'. The duplicate key value is (002-001-021, Census ).
Can anyone help me understand what I'm doing wrong?
Upvotes: 1
Views: 80
Reputation: 93754
You are only filtering the records which is already present in the PARCEL_ATTR
table. But you missed to remove the duplicates in CENSUS
table.
Use Window Function
to remove duplicates from CENSUS
table. Try this.
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;
Upvotes: 1
Reputation:
Please try the following:
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
I hope it helps some way.
Upvotes: 0