2017-01-04 2 views
3

Ich habe eine Tabelle, die wie folgt aussieht:Wie erstelle ich Permutationen in der gleichen Spalte mit SQL?

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

ich eine Ansicht erstellen möchten, die ohne Wiederholung in der folgenden Art und Weise alle 3-Buchstaben-Kombinationen dieser Buchstaben enthält also eine Nummer, die jeder Kombination zuweisen .

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

und so weiter.

Ist das obige möglich? Jede Hilfe wird sehr geschätzt.

+0

Wollen Sie Kombinationen oder Permutationen, z.B. wird ABC und BAC als Wiederholung betrachtet? –

Antwort

-1

Wenn Sie eine Liste aller eindeutigen Kombinationen zwischen zwei Tabellen erstellen möchten, müssen Sie nur aus beiden Tabellen auf einmal auswählen und SQL Server wird Ihnen geben, was Sie suchen. Dies nennt man 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 

Ergebnisse

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 
+0

Ein Cross-Join ist nicht die Antwort, schau dir die Buchstaben unter Nummer 2 in der Frage – Turo

+0

an Die gewünschte Ausgabe dort ließ es so erscheinen, als ob er Zahlen als Teil der Antwort wollte. Jetzt, wo du darauf hinweist, weiß ich nicht, warum diese da sind. Aber jetzt sehe ich das Ziel ... – mroach

1

Für Permutationen (Reihenfolge ist wichtig):

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 

Dies kann tatsächlich in einer einzigen Abfrage durchgeführt werden, doch mit der Wiederholung von @q Abfrage. Ich würde @ Q Query in Unteransicht verschieben, wenn View das Ziel ist.

Update: Verwenden UNPIVOT um die Dinge noch einfacher, als pointed out in Bhosale Antwort.

+0

Danke Dmitry, ich endete mit dem UNPIVOT, aber ich benutzte tatsächlich eine Variante Ihrer Methode für etwas anderes. Prost – jimbo1022

1

Überprüfen Sie dies. Mit Joins und UNPIVOT können wir alle Buchstabenkombinationen finden.

 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:

enter image description here

+0

Das hat super funktioniert. Ich wusste nicht einmal über UNPIVOT. Ich bin ziemlich neu in SQL. Vielen Dank – jimbo1022

Verwandte Themen