| |
|
If this is your first visit, be sure to check out the FAQ by clicking the link above.
You may have to register before you can post: click the register link above to proceed.
To start viewing messages, select the forum that you want to visit from the selection below.
|
 |

11-06-07, 16:46
|
|
Registered User
|
|
Join Date: Aug 2002
Location: Charlotte NC
Posts: 663
|
|
|
Advanced Merge code
|
|
I have a bit of a problem, and I have been staring at this all day so I may be making more of this than I need to.
My situation:
I need to merge two tables a stage table where I have todays set of data with the data warehouse table where the history is stored.
The code thus Far:
Code:
MERGE INTO CENDW.DW_RKSA_TPDOC_TBL DWTDOPTY
USING (SELECT STG.TPDOCID, CUSTNO, FKPARTYROLETP, INSTANCE_ID, PARTYNAME, CUNAME, CUADR1, CUADR2, CUADR3,
CITY_NAME, STATE, ZIP_CODE, FKPARTYROLESPECTXT, PARTYROLESPECTXT, FKPAYTERMTPAUTPOP, PAYTERMTPAUTOPOP,
PARTYROLETP, FKGEOAREACITYID, GEOAREACITYNAME, RKSTCITYCODE, FKGEOAREACNTRYID, GEOAREACNTRYNAME, RKST,
FKSHIPMENTVERSION, FKTRANSPORTDOCVER, GCSS_CRT_TS, GCSS_UPD_TS, RKSA_UPD_TS, TPC_UPD_TS
FROM CENSTG.STG_RKSA_TPDOC_PARTY_TBL STG INNER JOIN CENSTG.STG_RKSA_TPDOC_CHANGED_TPDOC_TBL CHGTDO on STG.TPDOCID = CHGTDO.TPDOCID) STGTDOPTY
ON (DWTDOPTY.TPDOCID = STGTDOPTY.TPDOCID )
WHEN MATCHED THEN
UPDATE SET
TPDOCID = STGTDOPTY.TPDOCID,
CUSTNO = STGTDOPTY.CUSTNO,
FKPARTYROLETP = STGTDOPTY.FKPARTYROLETP,
INSTANCE_ID = STGTDOPTY.INSTANCE_ID,
PARTYNAME = STGTDOPTY.PARTYNAME,
CUNAME = STGTDOPTY.CUNAME,
CUADR1 = STGTDOPTY.CUADR1,
CUADR2 = STGTDOPTY.CUADR2,
CUADR3 = STGTDOPTY.CUADR3,
CITY_NAME = STGTDOPTY.CITY_NAME,
STATE = STGTDOPTY.STATE,
ZIP_CODE = STGTDOPTY.ZIP_CODE,
FKPARTYROLESPECTXT = STGTDOPTY.FKPARTYROLESPECTXT,
PARTYROLESPECTXT = STGTDOPTY.PARTYROLESPECTXT,
FKPAYTERMTPAUTPOP = STGTDOPTY.FKPAYTERMTPAUTPOP,
PAYTERMTPAUTOPOP = STGTDOPTY.PAYTERMTPAUTOPOP,
PARTYROLETP = STGTDOPTY.PARTYROLETP,
FKGEOAREACITYID = STGTDOPTY.FKGEOAREACITYID,
GEOAREACITYNAME = STGTDOPTY.GEOAREACITYNAME,
RKSTCITYCODE = STGTDOPTY.RKSTCITYCODE,
FKGEOAREACNTRYID = STGTDOPTY.FKGEOAREACNTRYID,
GEOAREACNTRYNAME = STGTDOPTY.GEOAREACNTRYNAME,
RKST = STGTDOPTY.RKST,
FKSHIPMENTVERSION = STGTDOPTY.FKSHIPMENTVERSION,
FKTRANSPORTDOCVER = STGTDOPTY.FKTRANSPORTDOCVER,
GCSS_CRT_TS = STGTDOPTY.GCSS_CRT_TS,
GCSS_UPD_TS = STGTDOPTY.GCSS_UPD_TS,
RKSA_UPD_TS = STGTDOPTY.RKSA_UPD_TS,
TPC_UPD_TS = STGTDOPTY.TPC_UPD_TS,
DWH_UPDATE_TIMESTAMP = CURRENT TIMESTAMP
WHEN NOT MATCHED THEN
INSERT
(TPDOCID, CUSTNO, FKPARTYROLETP, INSTANCE_ID, PARTYNAME, CUNAME, CUADR1, CUADR2, CUADR3,
CITY_NAME, STATE, ZIP_CODE, FKPARTYROLESPECTXT, PARTYROLESPECTXT, FKPAYTERMTPAUTPOP, PAYTERMTPAUTOPOP,
PARTYROLETP, FKGEOAREACITYID, GEOAREACITYNAME, RKSTCITYCODE, FKGEOAREACNTRYID, GEOAREACNTRYNAME, RKST,
FKSHIPMENTVERSION, FKTRANSPORTDOCVER, GCSS_CRT_TS, GCSS_UPD_TS, RKSA_UPD_TS, TPC_UPD_TS)
VALUES (STGTDOPTY.TPDOCID, STGTDOPTY.CUSTNO, STGTDOPTY.FKPARTYROLETP, STGTDOPTY.INSTANCE_ID, STGTDOPTY.PARTYNAME,
STGTDOPTY.CUNAME, STGTDOPTY.CUADR1, STGTDOPTY.CUADR2, STGTDOPTY.CUADR3, STGTDOPTY.CITY_NAME, STGTDOPTY.STATE,
STGTDOPTY.ZIP_CODE, STGTDOPTY.FKPARTYROLESPECTXT, STGTDOPTY.PARTYROLESPECTXT, STGTDOPTY.FKPAYTERMTPAUTPOP, STGTDOPTY.PAYTERMTPAUTOPOP,
STGTDOPTY.PARTYROLETP, STGTDOPTY.FKGEOAREACITYID, STGTDOPTY.GEOAREACITYNAME, STGTDOPTY.RKSTCITYCODE, STGTDOPTY.FKGEOAREACNTRYID, STGTDOPTY.GEOAREACNTRYNAME, RKST,
STGTDOPTY.FKSHIPMENTVERSION, STGTDOPTY.FKTRANSPORTDOCVER, STGTDOPTY.GCSS_CRT_TS, STGTDOPTY.GCSS_UPD_TS,
STGTDOPTY.RKSA_UPD_TS, STGTDOPTY.TPC_UPD_TS)
Notice the ON section of my code. When this runs I get the error that the column CUSTNO cannot be updated. Custno is part of a composite primary key on both tables.
The full key is as follows:
TPDOCID
CUSTNO
FKPARTYROLETP
Does the error that I am recieving indicate that I need to be joining on all three columns? If so how do I do that? I have tried putting all Three within the parentises of the ON clause, and I have tried adding the key word and to the ON clause two other times, both of which were unsucessful.
I have been stairing at this code all day so it is starting to blur. A new set of eyes would be a great help.
Thanks for anything you can give
Jim
|
|

11-07-07, 09:04
|
|
Registered User
|
|
Join Date: Jan 2003
Posts: 3,575
|
|
Your ON clause should look like:
ON (DWTDOPTY.TPDOCID = STGTDOPTY.TPDOCID and DWTDOPTY.CUSTNO = STGTDOPTY.CUSTNO and DWTDOPTY.FKPARTYROLETP = STGTDOPTY.FKPARTYROLETP)
Also remove these columns from the update section.
Andy
|
|

11-07-07, 09:09
|
|
Registered User
|
|
Join Date: Aug 2002
Location: Charlotte NC
Posts: 663
|
|
|
|
I changed code as suggested and recieved the following error
SQL0206N "DWTDOPTY.CUSTNO " is not valid in the context where it is used.
Code:
MERGE INTO CENDW.DW_RKSA_TPDOC_TBL DWTDOPTY
USING (SELECT STG.TPDOCID, CUSTNO, FKPARTYROLETP, INSTANCE_ID, PARTYNAME, CUNAME, CUADR1, CUADR2, CUADR3,
CITY_NAME, STATE, ZIP_CODE, FKPARTYROLESPECTXT, PARTYROLESPECTXT, FKPAYTERMTPAUTPOP, PAYTERMTPAUTOPOP,
PARTYROLETP, FKGEOAREACITYID, GEOAREACITYNAME, RKSTCITYCODE, FKGEOAREACNTRYID, GEOAREACNTRYNAME, RKST,
FKSHIPMENTVERSION, FKTRANSPORTDOCVER, GCSS_CRT_TS, GCSS_UPD_TS, RKSA_UPD_TS, TPC_UPD_TS
FROM CENSTG.STG_RKSA_TPDOC_PARTY_TBL STG INNER JOIN CENSTG.STG_RKSA_TPDOC_CHANGED_TPDOC_TBL CHGTDO on STG.TPDOCID = CHGTDO.TPDOCID) STGTDOPTY
ON (DWTDOPTY.TPDOCID = STGTDOPTY.TPDOCID and DWTDOPTY.CUSTNO = STGTDOPTY.CUSTNO and DWTDOPTY.FKPARTYROLETP = STGTDOPTY.FKPARTYROLETP)
WHEN MATCHED THEN
UPDATE SET
INSTANCE_ID = STGTDOPTY.INSTANCE_ID,
PARTYNAME = STGTDOPTY.PARTYNAME,
CUNAME = STGTDOPTY.CUNAME,
CUADR1 = STGTDOPTY.CUADR1,
CUADR2 = STGTDOPTY.CUADR2,
CUADR3 = STGTDOPTY.CUADR3,
CITY_NAME = STGTDOPTY.CITY_NAME,
STATE = STGTDOPTY.STATE,
ZIP_CODE = STGTDOPTY.ZIP_CODE,
FKPARTYROLESPECTXT = STGTDOPTY.FKPARTYROLESPECTXT,
PARTYROLESPECTXT = STGTDOPTY.PARTYROLESPECTXT,
FKPAYTERMTPAUTPOP = STGTDOPTY.FKPAYTERMTPAUTPOP,
PAYTERMTPAUTOPOP = STGTDOPTY.PAYTERMTPAUTOPOP,
PARTYROLETP = STGTDOPTY.PARTYROLETP,
FKGEOAREACITYID = STGTDOPTY.FKGEOAREACITYID,
GEOAREACITYNAME = STGTDOPTY.GEOAREACITYNAME,
RKSTCITYCODE = STGTDOPTY.RKSTCITYCODE,
FKGEOAREACNTRYID = STGTDOPTY.FKGEOAREACNTRYID,
GEOAREACNTRYNAME = STGTDOPTY.GEOAREACNTRYNAME,
RKST = STGTDOPTY.RKST,
FKSHIPMENTVERSION = STGTDOPTY.FKSHIPMENTVERSION,
FKTRANSPORTDOCVER = STGTDOPTY.FKTRANSPORTDOCVER,
GCSS_CRT_TS = STGTDOPTY.GCSS_CRT_TS,
GCSS_UPD_TS = STGTDOPTY.GCSS_UPD_TS,
RKSA_UPD_TS = STGTDOPTY.RKSA_UPD_TS,
TPC_UPD_TS = STGTDOPTY.TPC_UPD_TS,
DWH_UPDATE_TIMESTAMP = CURRENT TIMESTAMP
WHEN NOT MATCHED THEN
INSERT
(TPDOCID, CUSTNO, FKPARTYROLETP, INSTANCE_ID, PARTYNAME, CUNAME, CUADR1, CUADR2, CUADR3,
CITY_NAME, STATE, ZIP_CODE, FKPARTYROLESPECTXT, PARTYROLESPECTXT, FKPAYTERMTPAUTPOP, PAYTERMTPAUTOPOP,
PARTYROLETP, FKGEOAREACITYID, GEOAREACITYNAME, RKSTCITYCODE, FKGEOAREACNTRYID, GEOAREACNTRYNAME, RKST,
FKSHIPMENTVERSION, FKTRANSPORTDOCVER, GCSS_CRT_TS, GCSS_UPD_TS, RKSA_UPD_TS, TPC_UPD_TS)
VALUES (STGTDOPTY.TPDOCID, STGTDOPTY.CUSTNO, STGTDOPTY.FKPARTYROLETP, STGTDOPTY.INSTANCE_ID, STGTDOPTY.PARTYNAME,
STGTDOPTY.CUNAME, STGTDOPTY.CUADR1, STGTDOPTY.CUADR2, STGTDOPTY.CUADR3, STGTDOPTY.CITY_NAME, STGTDOPTY.STATE,
STGTDOPTY.ZIP_CODE, STGTDOPTY.FKPARTYROLESPECTXT, STGTDOPTY.PARTYROLESPECTXT, STGTDOPTY.FKPAYTERMTPAUTPOP, STGTDOPTY.PAYTERMTPAUTOPOP,
STGTDOPTY.PARTYROLETP, STGTDOPTY.FKGEOAREACITYID, STGTDOPTY.GEOAREACITYNAME, STGTDOPTY.RKSTCITYCODE, STGTDOPTY.FKGEOAREACNTRYID, STGTDOPTY.GEOAREACNTRYNAME, RKST,
STGTDOPTY.FKSHIPMENTVERSION, STGTDOPTY.FKTRANSPORTDOCVER, STGTDOPTY.GCSS_CRT_TS, STGTDOPTY.GCSS_UPD_TS,
STGTDOPTY.RKSA_UPD_TS, STGTDOPTY.TPC_UPD_TS)
|
|

11-07-07, 09:30
|
|
Registered User
|
|
Join Date: Jan 2003
Posts: 3,575
|
|
I am not sure if this will work, but on your fullselect in the using clause, name each column.
USING (SELECT STG.TPDOCID as TPDOCID, CUSTNO as CUSTNO, FKPARTYROLETP as FKPARTYROLETP, INSTANCE_ID as INSTANCE_ID, PARTYNAME as PARTYNAME, ...
Andy
|
|

11-07-07, 09:40
|
|
Registered User
|
|
Join Date: Aug 2002
Location: Charlotte NC
Posts: 663
|
|
I have aliased the three key columns as suggested. There was no change in the error produced.
Its acting like it does not like the key column from the destination table...
|
|

11-07-07, 09:47
|
|
Registered User
|
|
Join Date: Jan 2003
Posts: 3,575
|
|
Oops, I was looking in the wrong place. What is the DDL for the CENDW.DW_RKSA_TPDOC_TBL table?
Andy
|
|

11-07-07, 09:56
|
|
Registered User
|
|
Join Date: Aug 2002
Location: Charlotte NC
Posts: 663
|
|
DDL is as follows
Code:
------------------------------------------------
-- DDL Statements for table "CENDW "."DW_RKSA_TPDOC_PARTY_TBL"
------------------------------------------------
CREATE TABLE "CENDW "."DW_RKSA_TPDOC_PARTY_TBL" (
"TPDOCID" VARCHAR(9) NOT NULL ,
"CUSTNO" VARCHAR(11) NOT NULL ,
"FKPARTYROLETP" VARCHAR(13) NOT NULL ,
"INSTANCE_ID" VARCHAR(13) ,
"PARTYNAME" VARCHAR(60) ,
"CUNAME" VARCHAR(36) ,
"CUADR1" VARCHAR(36) ,
"CUADR2" VARCHAR(36) ,
"CUADR3" VARCHAR(36) ,
"CITY_NAME" VARCHAR(36) ,
"STATE" VARCHAR(2) ,
"ZIP_CODE" VARCHAR(10) ,
"FKPARTYROLESPECTXT" VARCHAR(13) ,
"PARTYROLESPECTXT" VARCHAR(30) ,
"FKPAYTERMTPAUTPOP" VARCHAR(13) ,
"PAYTERMTPAUTOPOP" VARCHAR(30) ,
"PARTYROLETP" VARCHAR(40) ,
"FKGEOAREACITYID" VARCHAR(13) ,
"GEOAREACITYNAME" VARCHAR(35) ,
"RKSTCITYCODE" VARCHAR(15) ,
"FKGEOAREACNTRYID" VARCHAR(13) ,
"GEOAREACNTRYNAME" VARCHAR(35) ,
"RKST" VARCHAR(15) ,
"FKSHIPMENTVERSION" VARCHAR(13) ,
"FKTRANSPORTDOCVER" VARCHAR(13) ,
"GCSS_CRT_TS" TIMESTAMP ,
"GCSS_UPD_TS" TIMESTAMP ,
"RKSA_UPD_TS" TIMESTAMP ,
"TPC_UPD_TS" TIMESTAMP ,
"DWH_INSERT_TIMESTAMP" TIMESTAMP WITH DEFAULT CURRENT TIMESTAMP ,
"DWH_UPDATE_TIMESTAMP" TIMESTAMP )
IN "TS_16K" ;
-- DDL Statements for primary key on Table "CENDW "."DW_RKSA_TPDOC_PARTY_TBL"
ALTER TABLE "CENDW "."DW_RKSA_TPDOC_PARTY_TBL"
ADD PRIMARY KEY
("TPDOCID",
"CUSTNO",
"FKPARTYROLETP");
-- DDL Statements for indexes on Table "CENDW "."DW_RKSA_TPDOC_PARTY_TBL"
CREATE UNIQUE INDEX "CENDW "."ACU_RKSATDPA_01" ON "CENDW "."DW_RKSA_TPDOC_PARTY_TBL"
("TPDOCID" ASC,
"FKPARTYROLETP" ASC,
"CUSTNO" ASC)
CLUSTER ALLOW REVERSE SCANS;
|
|

11-07-07, 10:03
|
|
Registered User
|
|
Join Date: Jan 2003
Posts: 3,575
|
|
Check the merge table (MERGE INTO CENDW.DW_RKSA_TPDOC_TBL DWTDOPTY)
The DDL you provided is not the name of this table.
Andy
|
|

11-07-07, 10:06
|
|
Registered User
|
|
Join Date: Aug 2002
Location: Charlotte NC
Posts: 663
|
|
AGGGGGGG I knew I needed another set of eyes.
Thanks for the obvious catch
Corrected Code
Code:
MERGE INTO CENDW.DW_RKSA_TPDOC_PARTY_TBL DWTDOPTY
USING (SELECT STG.TPDOCID as TPDOCID, CUSTNO as CUSTNO, FKPARTYROLETP as FKPARTYROLETP, INSTANCE_ID, PARTYNAME, CUNAME, CUADR1, CUADR2, CUADR3,
CITY_NAME, STATE, ZIP_CODE, FKPARTYROLESPECTXT, PARTYROLESPECTXT, FKPAYTERMTPAUTPOP, PAYTERMTPAUTOPOP,
PARTYROLETP, FKGEOAREACITYID, GEOAREACITYNAME, RKSTCITYCODE, FKGEOAREACNTRYID, GEOAREACNTRYNAME, RKST,
FKSHIPMENTVERSION, FKTRANSPORTDOCVER, GCSS_CRT_TS, GCSS_UPD_TS, RKSA_UPD_TS, TPC_UPD_TS
FROM CENSTG.STG_RKSA_TPDOC_PARTY_TBL STG INNER JOIN CENSTG.STG_RKSA_TPDOC_CHANGED_TPDOC_TBL CHGTDO on STG.TPDOCID = CHGTDO.TPDOCID) STGTDOPTY
ON (DWTDOPTY.TPDOCID = STGTDOPTY.TPDOCID and DWTDOPTY.CUSTNO = STGTDOPTY.CUSTNO and DWTDOPTY.FKPARTYROLETP = STGTDOPTY.FKPARTYROLETP)
WHEN MATCHED THEN
UPDATE SET
INSTANCE_ID = STGTDOPTY.INSTANCE_ID,
PARTYNAME = STGTDOPTY.PARTYNAME,
CUNAME = STGTDOPTY.CUNAME,
CUADR1 = STGTDOPTY.CUADR1,
CUADR2 = STGTDOPTY.CUADR2,
CUADR3 = STGTDOPTY.CUADR3,
CITY_NAME = STGTDOPTY.CITY_NAME,
STATE = STGTDOPTY.STATE,
ZIP_CODE = STGTDOPTY.ZIP_CODE,
FKPARTYROLESPECTXT = STGTDOPTY.FKPARTYROLESPECTXT,
PARTYROLESPECTXT = STGTDOPTY.PARTYROLESPECTXT,
FKPAYTERMTPAUTPOP = STGTDOPTY.FKPAYTERMTPAUTPOP,
PAYTERMTPAUTOPOP = STGTDOPTY.PAYTERMTPAUTOPOP,
PARTYROLETP = STGTDOPTY.PARTYROLETP,
FKGEOAREACITYID = STGTDOPTY.FKGEOAREACITYID,
GEOAREACITYNAME = STGTDOPTY.GEOAREACITYNAME,
RKSTCITYCODE = STGTDOPTY.RKSTCITYCODE,
FKGEOAREACNTRYID = STGTDOPTY.FKGEOAREACNTRYID,
GEOAREACNTRYNAME = STGTDOPTY.GEOAREACNTRYNAME,
RKST = STGTDOPTY.RKST,
FKSHIPMENTVERSION = STGTDOPTY.FKSHIPMENTVERSION,
FKTRANSPORTDOCVER = STGTDOPTY.FKTRANSPORTDOCVER,
GCSS_CRT_TS = STGTDOPTY.GCSS_CRT_TS,
GCSS_UPD_TS = STGTDOPTY.GCSS_UPD_TS,
RKSA_UPD_TS = STGTDOPTY.RKSA_UPD_TS,
TPC_UPD_TS = STGTDOPTY.TPC_UPD_TS,
DWH_UPDATE_TIMESTAMP = CURRENT TIMESTAMP
WHEN NOT MATCHED THEN
INSERT
(TPDOCID, CUSTNO, FKPARTYROLETP, INSTANCE_ID, PARTYNAME, CUNAME, CUADR1, CUADR2, CUADR3,
CITY_NAME, STATE, ZIP_CODE, FKPARTYROLESPECTXT, PARTYROLESPECTXT, FKPAYTERMTPAUTPOP, PAYTERMTPAUTOPOP,
PARTYROLETP, FKGEOAREACITYID, GEOAREACITYNAME, RKSTCITYCODE, FKGEOAREACNTRYID, GEOAREACNTRYNAME, RKST,
FKSHIPMENTVERSION, FKTRANSPORTDOCVER, GCSS_CRT_TS, GCSS_UPD_TS, RKSA_UPD_TS, TPC_UPD_TS)
VALUES (STGTDOPTY.TPDOCID, STGTDOPTY.CUSTNO, STGTDOPTY.FKPARTYROLETP, STGTDOPTY.INSTANCE_ID, STGTDOPTY.PARTYNAME,
STGTDOPTY.CUNAME, STGTDOPTY.CUADR1, STGTDOPTY.CUADR2, STGTDOPTY.CUADR3, STGTDOPTY.CITY_NAME, STGTDOPTY.STATE,
STGTDOPTY.ZIP_CODE, STGTDOPTY.FKPARTYROLESPECTXT, STGTDOPTY.PARTYROLESPECTXT, STGTDOPTY.FKPAYTERMTPAUTPOP, STGTDOPTY.PAYTERMTPAUTOPOP,
STGTDOPTY.PARTYROLETP, STGTDOPTY.FKGEOAREACITYID, STGTDOPTY.GEOAREACITYNAME, STGTDOPTY.RKSTCITYCODE, STGTDOPTY.FKGEOAREACNTRYID, STGTDOPTY.GEOAREACNTRYNAME, RKST,
STGTDOPTY.FKSHIPMENTVERSION, STGTDOPTY.FKTRANSPORTDOCVER, STGTDOPTY.GCSS_CRT_TS, STGTDOPTY.GCSS_UPD_TS,
STGTDOPTY.RKSA_UPD_TS, STGTDOPTY.TPC_UPD_TS)
|
|

11-07-07, 10:17
|
|
Registered User
|
|
Join Date: Jan 2003
Posts: 3,575
|
|
Glad to be of help. We have all been there before.
The give-away was the "not valid in the context where it is used" error.
Andy
|
|
| Thread Tools |
Search this Thread |
|
|
|
| Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
|
|