[英]How can I create a BigQuery record with a join, but without specifying all fields?
[英]How to add/remove struct fields without re-specifying all other fields in BigQuery
我有以下数据形状和有效的 BigQuery 查询:
WITH
Person AS (
SELECT 'Alice' AS name, 10 AS address_id,
[STRUCT("Rexi" AS name, 5 AS species_id), STRUCT("Luna", 6)] AS pets UNION ALL
SELECT 'Bob', 11, [STRUCT("Ralfie", 5)] UNION ALL
SELECT 'Chandra', 10, []),
Address AS (
SELECT 10 AS id, 'Jump Street' AS street, 'UK' AS country UNION ALL
SELECT 11, 'Paper Street', 'US'
),
Species AS (
SELECT 5 AS id, 'Dog' as name, 11 as lifespan UNION ALL
SELECT 6, 'Cat', 15
)
SELECT p.* EXCEPT (address_id),
(SELECT AS STRUCT a.* EXCEPT(id)) AS address
FROM Person p
JOIN Address a ON p.address_id = a.id
正如我们所看到的, Person
有一个pets
记录数组,以及一个带有address
的可连接 id。 每个宠物也有一个可连接的 id 与species
。
就像我使用SELECT p.* EXCEPT (address_id)
从结果中删除address_id
并将地址作为每个人的结构加入一样,我希望我可以删除species_id
字段并将物种作为每个宠物的结构加入。
即,我希望我有像SELECT p.* EXCEPT (address_id, pets[*].species_id)
这样的语法和“加入结构内部”的能力。
我的理想结果将是一个不必重复所有物种字段名称的查询,但结果如下:
[{
"name": "Alice",
"pets": [{
"name": "Rexi",
"species": {
"name": "Dog",
"lifespan": 11,
}
}, {
"name": "Luna",
"species": {
"name": "Cat",
"lifespan": 15,
}
}],
"address": {
"street": "Jump Street",
"country": "UK"
}
},
<...>]
这有可能吗?
作为如何创建带有连接但不指定所有字段的 BigQuery 记录的后续答案? ,考虑以下查询:
SELECT p.* EXCEPT (address_id) REPLACE (
ARRAY(SELECT AS STRUCT p.* EXCEPT(species_id),
(SELECT AS STRUCT s.* EXCEPT(id)) AS species
FROM UNNEST(pets) p JOIN Species s ON p.species_id = s.id
)
AS pets
),
(SELECT AS STRUCT a.* EXCEPT(id)) AS address
FROM Person p
JOIN Address a ON p.address_id = a.id;
输出将是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.