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
现在它可以正确地用于空数组和非空数组。如果有人能解释的话,我很想理解为什么这是必要的