Более простое слияние - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь написать BQ Merge Query, который выполняет что-то вроде upsert. У меня есть основная таблица (M) и идентичная дельта-таблица (D), которая приносит измененные записи. Оператор слияния должен работать так, как если бы ключи совпадали, он обновит все поля таблицы в основной таблице данными дельта-таблицы, а если ключи не совпадают, он выполнит вставку значений дельта-таблицы. Мне удалось заставить оператор Merge работать, но он кажется слишком длинным. Есть ли более короткий способ сделать это. У меня в таблице более 190 столбцов. Пожалуйста, смотрите код слияния ниже.

merge zsac_figl01.zsaplikp02 M
using zsac_figl01.zsaplikp02_delta D
on M.VBELN = D.VBELN 
WHEN MATCHED THEN 
UPDATE 
SET 
M.VBELN =  D.VBELN ,
M.ERNAM =  D.ERNAM ,
M.ERZET =  D.ERZET ,
M.ERDAT =  D.ERDAT ,
M.BZIRK =  D.BZIRK ,
M.VSTEL =  D.VSTEL ,
M.VKORG =  D.VKORG ,
M.LFART =  D.LFART ,
M.AUTLF =  D.AUTLF ,
M.KZAZU =  D.KZAZU ,
M.WADAT =  D.WADAT ,
M.LDDAT =  D.LDDAT ,
M.TDDAT =  D.TDDAT ,
M.LFDAT =  D.LFDAT ,
M.KODAT =  D.KODAT ,
M.ABLAD =  D.ABLAD ,
M.INCO1 =  D.INCO1 ,
M.INCO2 =  D.INCO2 ,
M.EXPKZ =  D.EXPKZ ,
M.ROUTE =  D.ROUTE ,
M.FAKSK =  D.FAKSK ,
M.LIFSK =  D.LIFSK ,
M.VBTYP =  D.VBTYP ,
M.KNFAK =  D.KNFAK ,
M.TPQUA =  D.TPQUA ,
M.TPGRP =  D.TPGRP ,
M.LPRIO =  D.LPRIO ,
M.VSBED =  D.VSBED ,
M.KUNNR =  D.KUNNR ,
M.KUNAG =  D.KUNAG ,
M.KDGRP =  D.KDGRP ,
M.STZKL =  D.STZKL ,
M.STZZU =  D.STZZU ,
M.BTGEW =  D.BTGEW ,
M.NTGEW =  D.NTGEW ,
M.GEWEI =  D.GEWEI ,
M.VOLUM =  D.VOLUM ,
M.VOLEH =  D.VOLEH ,
M.ANZPK =  D.ANZPK ,
M.BEROT =  D.BEROT ,
M.LFUHR =  D.LFUHR ,
M.GRULG =  D.GRULG ,
M.LSTEL =  D.LSTEL ,
M.TRAGR =  D.TRAGR ,
M.FKARV =  D.FKARV ,
M.FKDAT =  D.FKDAT ,
M.PERFK =  D.PERFK ,
M.ROUTA =  D.ROUTA ,
M.STAFO =  D.STAFO ,
M.KALSM =  D.KALSM ,
M.KNUMV =  D.KNUMV ,
M.WAERK =  D.WAERK ,
M.VKBUR =  D.VKBUR ,
M.VBEAK =  D.VBEAK ,

WHEN NOT MATCHED THEN INSERT 
(
VBELN ,
ERNAM ,
ERZET ,
ERDAT ,
BZIRK ,
VSTEL ,
VKORG ,
LFART ,
AUTLF ,
KZAZU ,
WADAT ,
LDDAT ,
TDDAT ,
LFDAT ,
KODAT ,
ABLAD ,
INCO1 ,
INCO2 ,
EXPKZ ,
ROUTE ,
FAKSK ,
LIFSK ,
VBTYP ,
KNFAK ,
TPQUA ,
TPGRP ,
LPRIO ,
VSBED ,
KUNNR ,
KUNAG ,
KDGRP ,
STZKL ,
STZZU ,
BTGEW ,
NTGEW ,
GEWEI ,
VOLUM ,
VOLEH ,
ANZPK ,
BEROT ,
LFUHR ,
GRULG ,
LSTEL ,
TRAGR ,
FKARV ,
FKDAT ,
PERFK ,
ROUTA ,
STAFO ,
KALSM ,
KNUMV ,
WAERK ,
VKBUR ,
VBEAK ,


)

VALUES 

(
D.VBELN,
D.ERNAM,
D.ERZET,
D.ERDAT,
D.BZIRK,
D.VSTEL,
D.VKORG,
D.LFART,
D.AUTLF,
D.KZAZU,
D.WADAT,
D.LDDAT,
D.TDDAT,
D.LFDAT,
D.KODAT,
D.ABLAD,
D.INCO1,
D.INCO2,
D.EXPKZ,
D.ROUTE,
D.FAKSK,
D.LIFSK,
D.VBTYP,
D.KNFAK,
D.TPQUA,
D.TPGRP,
D.LPRIO,
D.VSBED,
D.KUNNR,
D.KUNAG,
D.KDGRP,
D.STZKL,
D.STZZU,
D.BTGEW,
D.NTGEW,
D.GEWEI,
D.VOLUM,
D.VOLEH,
D.ANZPK,
D.BEROT,
D.LFUHR,
D.GRULG,
D.LSTEL,
D.TRAGR,
D.FKARV,
D.FKDAT,
D.PERFK,
D.ROUTA,
D.STAFO,
D.KALSM,
D.KNUMV,
D.WAERK,
D.VKBUR,
D.VBEAK,
D.ZUKRL,
D.VERUR,
D.COMMN,
D.STWAE,
D.STCUR,
D.EXNUM,
D.AENAM,
D.AEDAT,
D.LGNUM,
D.LISPL,
D.VKOIV,
D.VTWIV,
D.SPAIV,
D.FKAIV,
D.PIOIV,
D.FKDIV,
D.KUNIV,
D.KKBER,
D.KNKLI,
D.GRUPP,
D.SBGRP,
D.CTLPC,
D.CMWAE,
D.AMTBL,
D.BOLNR,
D.LIFNR,
D.TRATY,
D.TRAID,
D.CMFRE,
D.CMNGV,
D.XABLN,
D.BLDAT,
D.WADAT_IST,
D.TRSPG,
D.TPSID,
D.LIFEX,
D.TERNR,
D.KALSM_CH,
D.KLIEF,
D.KALSP,
D.KNUMP,
D.NETWR,
D.AULWE,
D.WERKS,
D.LCNUM,
D.ABSSC,
D.KOUHR,
D.TDUHR,
D.LDUHR,
D.WAUHR,
D.LGTOR,
D.LGBZO,
D.AKWAE,
D.AKKUR,
D.AKPRZ,
D.PROLI,
D.XBLNR,
D.HANDLE,
D.TSEGFL,
D.TSEGTP,
D.TZONIS,
D.TZONRC,
D.CONT_DG,
D.VERURSYS,
D.KZWAB,
D.VLSTK,
D.TCODE,
D.VSART,
D.TRMTYP,
D.SDABW,
D.VBUND,
D.XWOFF,
D.DIRTA,
D.PRVBE,
D.FOLAR,
D.PODAT,
D.POTIM,
D.VGANZ,
D.IMWRK,
D.SPE_LOEKZ,
D.SPE_LOC_SEQ,
D.SPE_ACC_APP_STS,
D.SPE_SHP_INF_STS,
D.SPE_RET_CANC,
D.SPE_WAUHR_IST,
D.SPE_WAZONE_IST,
D.SPE_REV_VLSTK,
D.SPE_LE_SCENARIO,
D.SPE_ORIG_SYS,
D.SPE_CHNG_SYS,
D.SPE_GEOROUTE,
D.SPE_GEOROUTEIND,
D.SPE_CARRIER_IND,
D.SPE_GTS_REL,
D.SPE_GTS_RT_CDE,
D.SPE_REL_TMSTMP,
D.SPE_UNIT_SYSTEM,
D.SPE_INV_BFR_GI,
D.SPE_QI_STATUS,
D.SPE_RED_IND,
D.SAKES,
D.SPE_LIFEX_TYPE,
D.SPE_TTYPE,
D.SPE_PRO_NUMBER,
D.LOC_GUID,
D.SPE_BILLING_IND,
D.PRINTER_PROFILE,
D.MSR_ACTIVE,
D.PRTNR,
D.STGE_LOC_CHANGE,
D.TM_CTRL_KEY,
D.DLV_SPLIT_INITIA,
D.DLV_VERSION,
D.BEV1_LULEINH,
D.BEV1_RPFAESS,
D.BEV1_RPKIST,
D.BEV1_RPCONT,
D.BEV1_RPSONST,
D.BEV1_RPFLGNR,
D.BORGR_GRP,
D.ZLAND1,
D.ZZTVGW,
D.ZZVTW,
D.ZZFRGEW,
D.ZZANZPAL,
D.ZZKDKG1,
D.ZZVOLLPAL
)`

1 Ответ

2 голосов
/ 06 июня 2019

если ключи совпадают, обновятся все поля таблицы в основной таблице с данными дельта-таблицы, а если ключи не совпадают, будет выполнена вставка значений дельта-таблицы

Исходя из вышеизложенного, я предполагаю, что схема основной и дельта-таблиц идентична
Таким образом, вы можете исследовать возможность делать DELETE и INSERT вместо UPDATE и INSERT

Что-то вроде

DELETE zsac_figl01.zsaplikp02
WHERE VBELN IN (SELECT VBELN FROM zsac_figl01.zsaplikp02_delta)   

И затем (примечание - Пропуск имен столбцов находится в бета-версии с 3 июня 2019 года, поэтому вам следует попробовать)

INSERT zsac_figl01.zsaplikp02
SELECT * FROM zsac_figl01.zsaplikp02_delta   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...