2016-05-31 18 views
1

ich eine Anfrage erstellt haben, die mir IDs von Zeilen mit der gleichen Spalte Wert zurückgibt. Zum Beispiel:SQL SELECT doppelte Zeilen basierend auf mehreren Spalten

id | Value 
______________ 
1  | label1 
2  | label1 
3  | label1 
4  | label2 
5  | label2 

Ich mag diese Art von Ergebnis erhalten:

id | AlternateID | Value 
______________________________ 
1  | 2    | label1 
1  | 3    | label1 
4  | 5    | label2 

Das beste Ergebnis, das ich so weit gekommen ist:

id | AlternateID | Value 
______________________________ 
1  | 2    | label1 
2  | 1    | label1 
1  | 3    | label1 
3  | 1    | label1 
4  | 5    | label2 
5  | 4    | label2 

Aber wie Sie sehen können, ich Duplikate Wert für die ersten beiden Spalten haben

... Gerade jetzt, ohne Cursor zu verwenden, ich bin fest.

Ich bin auf SQL Server 2008.

Danke für Ihre Hilfe

+1

Können Sie die Logik hinter den Zahlen erklären? Es ist nicht offensichtlich für mich. –

+0

Wir können nicht sagen, wonach Sie wirklich suchen. Willst du nach Gruppen sortieren und zählen? – Chuck

+0

Die ersten Tabellennummern entsprechen der ID der Zeile. die zweite Tabelle ist wie eine Karte. Zum Beispiel, ID 1 kann stattdessen ID 2 und ID 3/ID 4 ben statt ID5 verwendet wird, kann Ich denke, es ist etwas von Klausel um eine Gruppe verwendet werden ... aber ich bin wirklich stecken ... – r4phG

Antwort

1

Verwenden Sie eine abgeleitete Tabelle Ihrer Basis Werte gelten zu bekommen und es wieder auf den ursprünglichen Tisch kommen.

SELECT 
    a.id, 
    b.id as AlternateID, 
    a.value 
FROM 
    (SELECT MIN(id) as id , value FROM YourTable GROUP BY value) a 
JOIN YourTable b on a.value = b.value and a.id <> b.id 
+0

Das war die Lösung! Vielen Dank ! – r4phG

1

Sie scheinen Paare von Iden mit dem gleichen Wert zu wollen.

with t as (
     <your query here> 
    ) 
select t1.id as id1, t2.id as id2, t1.value 
from t t1 join 
    t t2 
    on t1.id < t2.id and t1.value = t2.value; 
+0

Das Problem der Lösung ist, dass ich diese '1 | 2 | label1 '// ' 2 | 1 | label1' .... Ich habe auch dieses Ergebnis mit einem Join:/ – r4phG

+0

@ r4phG. . . Ganz und gar nicht. Die 't1.id

+0

Sie haben Recht, ich verwendet habe 't1.id <> t2.id', die das Problem verursacht. Entschuldigung und danke – r4phG

0

die min Reihe Holen Sie zuerst, dann äußere oder Außen auf alternative Werte

SELECT mt.id, mt2.AlternateID, mt.Value 
FROM (SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY VALUE ORDER BY id) Rn 
      FROM myTable 
     ) mt 
     OUTER APPLY (SELECT id [AlternateID] -- use CROSS APPLY to only return dupes 
        FROM myTable mt2 
        WHERE mt2.VALUE = mt.VALUE AND mt2.id <> mt.id) mt2 
WHERE Rn = 1 
+0

Sorry, vielleicht könnte das funktionieren, aber ich konnte diese Abfrage nicht erhalten:/ – r4phG

+0

Haben Sie versucht, Ihren tatsächlichen Tabellennamen zu verwenden? – JamieD77

+0

^^. Na sicher ! Ich habe ein Problem um die OVER (PARTITION ...) Rn – r4phG

Verwandte Themen