2017-08-07 1 views
0

J'ai une table N x M dans une base de données vertica, mon but est de créer une nouvelle table avec N*M x M de sorte que chaque ligne de la table initiale soit remplacée par M lignes où l'élément de départ est permuté.SQL: Développez la table existante en permutant l'élément de départ

Voici un exemple pour un 2 x 3 Tableau

+-------+-------+-------+ 
| Item1 | Item2 | Item3 | 
+-------+-------+-------+ 
| A  | B  | C  | 
| C  | K  | L  | 
+-------+-------+-------+ 

Devenir 6 x 3 table où chaque ligne de la rangée d'origine a obtenu remplacé par 3 nouvelles lignes où Item1 est toujours un autre élément de départ. Y at-il une solution élégante à ce genre de problème, j'ai essayé d'utiliser la jonction de plusieurs façons, mais jusqu'à présent, pas de chance. Merci!!

+0

Il n'y a pas de solution élégante. –

+0

J'avais peur de cette réponse. – valenzio

Répondre

1

Je ne peux pas vous aider dans le cas général. Dans le cas concret, cela fonctionnerait-il dans Vertica?

select 
    case n 
     when 1 then item1 
     when 2 then item2 
     else item3 
    end as item1, 
    case n 
     when 1 then item2 
     when 2 then item3 
     else item1 
    end as item2, 
    case n 
     when 1 then item3 
     when 2 then item1 
     else item2 
    end as item3 
from tab 
cross join (select 1 as n union all select 2 as n union all select 3 as n) as b 

Je suis un homme SQL Server moi-même, et il serait heureux de droite faire cette requête dynamiquement à partir de la définition de la table (compte tenu des contraintes raisonnables sur les métadonnées de table), mais hélas, je ne sais pas Vertica

+0

Cela fonctionne dans Vertica, je génère mes requêtes avec python, donc je vais essayer de trouver une routine qui fonctionne pour le cas général. Merci pour la contribution. – valenzio

0

Je pensais pourquoi ne pas simplement utiliser un tas de syndicats comme

SELECT Item1, Item2, Item3 from Table 
union SELECT Item2, Item3, Item1 from Table 
UNION SELECT Item3, Item1, Item2 from Table 

cela devrait donner le même résultat, non?