Comment puis-je produire des permutations dans la même colonne en utilisant SQL?

J'ai une table qui ressemble à ceci:

LETTERS -------- A B C D E F G H 

Je voudrais créer une vue qui répertorie toutes les combinaisons de 3 lettres de ces lettres sans répétition de la manière suivante, c'est-à-dire en atsortingbuant un numéro à chaque combinaison.

 ViewNew ------- 1 A 1 B 1 C 2 A 2 B 2 D 3 A 3 B 3 E 

etc.

Est-ce que ce qui précède est possible? Toute aide sera très appréciée.

Vérifie ça. En utilisant Joins et UNPIVOT nous pouvons find toutes les permutations de lettres.

  select ID,ViewNew from ( select row_number() over(order by (select 1)) AS ID, C2.LETTERS as '1' ,C1.LETTERS AS '2' ,c3.LETTERS as '3' from #tableName C1,#tableName c2,#tableName c3 where C1.LETTERS != c2.LETTERS and c2.LETTERS ! = c3.LETTERS and c1.LETTERS ! = c3.LETTERS ) a UNPIVOT ( ViewNew FOR [LETTERS] IN ([1], [2], [3]) )as f 

OutPut:

entrez la description de l'image ici

Pour les permutations (l'ordre est important):

 DECLARE @q as table([No] int, L1 char(1), L2 char(1), L3 char(1)) INSERT INTO @q SELECT ROW_NUMBER() OVER (ORDER BY L1.Letter, L2.Letter, L3.Letter, L1.Letter), L1.Letter, L2.Letter, L3.Letter FROM Letters L1 CROSS JOIN Letters AS L2 CROSS JOIN Letters AS L3 WHERE (L1.Letter <> L2.Letter) AND (L2.Letter <> L3.Letter) AND (L1.Letter <> L3.Letter) SELECT [No], L1 AS Letter FROM @q UNION SELECT [No], L2 FROM @q UNION SELECT [No], L3 FROM @q 

Cela peut effectivement être fait dans une seule requête, mais avec la répétition de la requête @q. Je voudrais déplacer la requête @q dans la sous-vue, si View est l'objective.

Mise à jour: Utilisez UNPIVOT pour rendre les choses encore plus simples, comme indiqué dans la réponse de Bhosale.

Si vous souhaitez créer une list de toutes les combinaisons uniques entre deux tables, vous n'avez besoin de sélectionner que les deux tables à la fois et SQL Server vous donnera ce que vous searchz. C'est ce qu'on appelle un CROSS JOIN .

 declare @t1 table (letter char(1)) declare @t2 table (number int) insert @t1 values ('A'), ('B'), ('C') insert @t2 values (1), (2), (3), (4) select t2.number, t1.letter from @t1 as t1, @t2 as t2 

Résultats

 number letter -------------- 1 A 1 B 1 C 2 A 2 B 2 C 3 A 3 B 3 C 4 A 4 B 4 C