Google bigquery BigQuery合并查询不使用空重复字段

Google bigquery BigQuery合并查询不使用空重复字段,google-bigquery,Google Bigquery,我正在尝试对具有以下架构的表运行合并查询: [ { "mode":"REQUIRED", "name":"container_ref", "type":"STRING" }, { "mode":"REQUIRED", "name":"

我正在尝试对具有以下架构的表运行合并查询:

[
   {
      "mode":"REQUIRED",
      "name":"container_ref",
      "type":"STRING"
   },
   {
      "mode":"REQUIRED",
      "name":"receive_date",
      "type":"DATE"
   },
   {
      "mode":"REQUIRED",
      "name":"vendor_id",
      "type":"INTEGER"
   },
   {
      "fields":[
         {
            "mode":"NULLABLE",
            "name":"code",
            "type":"STRING"
         },
         {
            "mode":"NULLABLE",
            "name":"quantity",
            "type":"INTEGER"
         }
      ],
      "mode":"REPEATED",
      "name":"products",
      "type":"RECORD"
   },
   {
      "mode":"REQUIRED",
      "name":"max_fill_ratio",
      "type":"FLOAT"
   }
]
我正在尝试运行以下查询:

合并`project.dataset.table`T 使用 将容器_数据作为 选择 “永康210222”作为集装箱参考 ,日期'2021-02-22'为接收日期 ,51695作为供应商id ,最大填充率为0.5 ,[]作为产品 从容器_数据中选择* s 在T.container\u ref=S.container\u ref上 当匹配时 更新集T.products=S.products,T.max\u fill\u ratio=S.max\u fill\u ratio 当不匹配时 插入容器编号、接收日期、供应商id、产品、最大填充率 值容器参考号、接收日期、供应商id、产品、最大填充率 当源和接收日期不匹配时,则 删去 如您所见,在源数据中,products是一个空数组。我从查询中收到以下错误:

无法将数组类型的值分配给T.products,因为T.products具有 类型数组

当使用未设置为空数组的产品运行同一查询时,它会正常工作。例如:

合并`project.dataset.table`T 使用 将容器_数据作为 选择 “永康210222”作为集装箱参考 ,日期'2021-02-22'为接收日期 ,51695作为供应商id ,最大填充率为0.5 ,[STRUCT'01757'作为代码,10作为数量,STRUCT'03831'作为代码,20作为数量]作为产品 从容器_数据中选择* s 在T.container\u ref=S.container\u ref上 当匹配时 更新集T.products=S.products,T.max\u fill\u ratio=S.max\u fill\u ratio 当不匹配时 插入容器编号、接收日期、供应商id、产品、最大填充率 值容器参考号、接收日期、供应商id、产品、最大填充率 当源和接收日期不匹配时,则 删去 我不明白为什么合并查询中的空数组会导致此错误。我尝试过为产品插入和更新带有空数组的表,效果很好。例如,此查询工作正常:

插入到“project.dataset.table”中` 容器参考、接收日期、供应商id、最大填充率、产品 价值观 ‘永康(210222)’ ,日期'2021-02-22' , 51695 , 0.5 , []
这开始感觉像是一个大的查询错误。有人知道为什么会发生这种情况吗?

我不知道为什么,但在数组之前添加数组解决了这个问题:

MERGE `project.dataset.table` T
USING (
  WITH container_data AS (
    SELECT
        'yongkang_210222' AS container_ref
      , DATE('2021-02-22') AS receive_date
      , 51695 AS vendor_id
      , 0.5 AS max_fill_ratio
      , ARRAY<STRUCT<code STRING, quantity INT64>> [] AS products
  )
  SELECT * FROM container_data
) S
ON T.container_ref = S.container_ref
WHEN MATCHED THEN
  UPDATE SET T.products = S.products, T.max_fill_ratio = S.max_fill_ratio
WHEN NOT MATCHED THEN
  INSERT (container_ref, receive_date, vendor_id, products, max_fill_ratio)
  VALUES(container_ref, receive_date, vendor_id, products, max_fill_ratio)
WHEN NOT MATCHED BY SOURCE AND receive_date = '2021-02-22' THEN
  DELETE
现在它可以正确地用于空数组和非空数组。如果有人能解释的话,我很想理解为什么这是必要的