2011-09-17 21 views
8

Powiel możliwe:
combinations (not permutations) from cross join in sqlSQL: self przyłączyć za pomocą każdego wiersze tylko raz

Ja obecnie mam tabelę z następujących zapisów:

A1 
A2 
A3 
B1 
B2 
C1 
C2 

Gdzie ta sama litera oznacza pewne wspólne kryteria (np. wspólna wartość dla kolumny "litera"). Mam self przyłączyć się na kryteriach, co następuje:

SELECT mytable.*, self.* FROM mytable INNER JOIN mytable AS self 
    ON (mytable.letter = self.letter and mytable.number != self.number); 

Ten dołączyć daje coś jak następuje:

A1 A2 
A2 A1 
A1 A3 
A3 A1 
A2 A3 
A3 A2 
B1 B2 
B2 B1 
C1 C2 
C2 C1 

Jednak chcę tylko obejmować każdą parę raz (połączenie zamiast permutacji). Jak uzyskać następujące:

A1 A2 
A1 A3 
A2 A3 
B1 B2 
C1 C2 
+0

dodali do tej odpowiedzi znacznik "samodzielne łączenie", to jest to, czego szukałem. – EoghanM

Odpowiedz

17

Zmiana stanu DOŁĄCZ nieznacznie będzie osiągnąć to, co chcesz ..

Zamiast:

ON (mytable.letter = self.letter and mytable.number != self.number) 

użycie

ON (mytable.letter = self.letter and mytable.number > self.number) 

ten będą zawierać tylko kombinacje, w których self.number jest większa niż mytable.number co w efekcie ogranicza wyniki do jednej prawidłowej kolejności każdej kombinacji ...