合并声明更容易

时间:2019-06-05 21:03:16

标签: google-bigquery

我正在尝试编写一个BQ合并查询,该查询的功能类似于upsert。我有一个主表(M)和一个相同的增量表(D),它们带来了更改的记录。 merge语句的工作方式类似于键匹配时,它将使用增量表数据更新主表中的所有表字段,如果键不匹配,则将插入增量表值。我能够使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 个答案:

答案 0 :(得分:2)

  

如果键匹配,它将使用增量表数据更新主表中的所有表字段,如果键不匹配,则将插入增量表值

基于上述情况,我假设主表和增量表的架构相同
因此,您可以探索执行DELETE和INSERT而不是UPDATE和INSERT的选项

类似

version: '3'

networks:
  backend:
    driver: bridge

services:
### PHP-FPM ##############################################
    php-fpm:
      image: php-fpm
      container_name: php-fpm
      build:
        context: ../
        dockerfile: ./laradock/php-fpm/Dockerfile-Prod
        args:
          - LARADOCK_PHP_VERSION=7.2
          - INSTALL_PGSQL=true
          - INSTALL_PG_CLIENT=true
          - INSTALL_POSTGIS=true
      expose:
        - "9000"
      networks:
        - backend

### NGINX Server #########################################
    nginx:
      image: nginx
      container_name: nginx
      build:
        context: ../
        dockerfile: ./laradock/nginx/Dockerfile-Prod
        args:
          - http_proxy
          - https_proxy
          - no_proxy
      ports:
        - "80:80"
        - "443:443"
      depends_on:
        - php-fpm
      networks:
        - backend

然后(注意-Omitting column names自2019年6月3日起处于Beta版,因此您应该尝试)

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