Modification de la question pour avoir une meilleure vue. P>
Il y a 2 tables - mise en scène et noyau. p>
J'ai du mal à copier les données de la mise en scène vers le noyau. p>
Conditions P>
- si
id code>,
année code> et
local_id code> correspondant dans la mise en scène et le noyau -> les données code> pour ce spécifique La rangée de tableau doit être mise à jour de la mise en scène vers le noyau li>
- Si
ID code> ne correspond pas à la mise en scène et à la noyau -> Une nouvelle ligne doit être insérée dans le noyau avec des valeurs de la stadification li>
- Si
ID code> correspond à des correspondances mais de
local_id code> /
Année code> ne correspondez pas, une nouvelle ligne doit être insérée dans les données
Code> Array. Li> ol>
schéma de bigquery pour la mise en scène p>
xxx pré> schéma de bigquery pour le noyau p>
xxx pré> Contenu de grande requête pour la mise en scène - p>
xxx pré> exemple de structure de contenu
p>
Contenu de grande requête pour le noyau - P>
{"id":"1","content":"content1","createdAt":"2020-07-23 12:46:15.054410 UTC","data":[{"local_id":"123","year":2018,"country":"SE"},{"local_id":"33","year":2019,"country":"PL"},{"local_id":"123","year":2020,"country":"SE"}]}
3 Réponses :
Cette requête peut être utilisée pour faire "Mise à jour si présent" exigence: p> https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#update_utilisateur_joines < / P> https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays#Combiny_arrays p> ol>
Ce scénario ne fonctionne pas lorsqu'il n'y a pas de dossier dans la table de destination.
Essayez d'utiliser Fusionner Code>
Déclaration:
MERGE `dataset.destination` D USING (select id, array(select data) data from `dataset.source`) S ON D.id = S.id WHEN MATCHED THEN UPDATE SET data = S.data WHEN NOT MATCHED THEN INSERT (id, data) VALUES(S.id, S.data)
Avec les données de destination étant un tableau, cette condition ne fonctionne pas !!
@deep a mis à jour la réponse. S'il vous plaît laissez-moi savoir si cela fonctionne maintenant
J'ai mis à jour la question à avoir clarté .. Pouvez-vous vérifier maintenant?
J'étais enfin capable de clouer le problème. Pour fusionner 2 enregistrements, je devais recourir à des sous-requêtes poussant dans certains travaux. Bien que, je pense toujours qu'il y a des chances d'amélioration de ce code.
-- INSERT IDs INSERT `deep_test.main_table` (people_id) ( SELECT distinct(people_id) FROM `deep_test.staging_test` WHERE people_id NOT IN ( SELECT people_id FROM `deep_test.main_table` ) ); -- UPDATE TALENT RECORD UPDATE `deep_test.main_table` gold SET talent = B.talent FROM ( SELECT gold.people_id as people_id, ARRAY_AGG(aggregated_stage.talent) as talent FROM `deep_test.main_table` gold JOIN ( SELECT A.people_id, A.talent FROM ( SELECT ARRAY_AGG( t ORDER BY t.createdAt DESC LIMIT 1 )[OFFSET(0)] A FROM `deep_test.staging_test` t GROUP BY t.people_id, t.talent.people_l_id, t.talent.fiscalYear ) ) as aggregated_stage ON gold.people_id = aggregated_stage.people_id WHERE aggregated_stage.talent is not null GROUP BY people_id ) B WHERE B.people_id = gold.people_id; -- UPDATE COUNTRY CODE UPDATE `deep_test.core` core set core.country_code = countries.number FROM ( select people_id , (select country from UNNEST(talent) as d order by d.fiscalYear DESC limit 1) as country FROM `deep_test.core` ) B, `deep_test.countries` countries WHERE core.people_id = B.people_id AND countries.code = B.country;
Voyons si je comprends bien: votre premier code insère dans votre table de destination tous les identifiants de la table source qui n'existe pas encore dans la destination. Dans le deuxième code, vous remplacez le champ de données de votre table de destination avec le champ de données de votre tableau source en fonction du champ ID?
@RMestevès Oui, c'est comme ça que ça a fonctionné pour moi. Ce pourrait être une façon brute de le faire.