2017-09-13 5 views
0

J'ai deux tables A (i, j, k) et B (m, n).Est-il possible de mettre à jour une table d'une autre table sans une jointure dans Vertica?

Je veux mettre à jour la colonne 'm' de la table B en prenant sum (j) de la table A. Est-il possible de le faire dans Vertica?

Le code suivant peut être utilisé pour Teradata, mais Vertica at-il ce type de flexibilité?

Update B from (select sum(j) as m from A)a1 set m=a1.m; 
+1

Il s'agit d'une syntaxe légèrement particulière, User3503711, donc j'essaie de comprendre ce que vous attendez de lui. 'UPDATE

FROM ...' n'est pas une syntaxe SQL standard. On dirait que vous voulez que la colonne 'm' dans toutes les lignes de la table' B' prenne la valeur que vous obtenez quand vous 'SUM (j)' dans la table 'A'. Est-ce correct? – marcothesane

+0

C'est une syntaxe SQL Teradata. La syntaxe similaire est publiée [ici] (https://stackoverflow.com/questions/10987152/teradata-update-table-from-select-statement) .Et Oui, c'est ce que je veux faire. La somme (j) de la table A sera copiée dans la colonne m de la table B. - @marcothesane – user3503711

Répondre

2

La syntaxe SQL Teradata ne fonctionne pas avec Vertica, mais la requête suivante devrait faire la même chose:

update B set m = (select sum(j) from A) 
0

En fonction de la taille de vos tables, cela ne peut être un moyen efficace mettre à jour les données. Vertical est un magasin WORM (écrire une fois lu plusieurs fois) et n'est pas optimisé pour les mises à jour ou les suppressions.

Une autre solution consisterait à déplacer temporairement les données de la table cible vers une autre table intermédiaire (mais pas temporaire). Après cela, écrivez une requête de jointure en utilisant l'autre table pour produire le résultat désiré, et finalement utilisez export table avec cette requête de jointure. Enfin, déposez la table intermédiaire. Bien sûr, cela suppose que vous avez partitionné votre table d'une manière adaptée à votre logique de mise à jour.