2011-09-17 9 views
8

Eventuali duplicati:
combinations (not permutations) from cross join in sqlSQL: self join utilizzando ogni file solo una volta

ho attualmente ottenuto un tavolo con i seguenti record:

A1 
A2 
A3 
B1 
B2 
C1 
C2 

Dove la stessa lettera indica alcuni criteri comuni (ad esempio un valore comune per la colonna 'lettera'). Io un auto unisco a questi criteri, come segue:

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

Questa unirsi dà qualcosa di simile al seguente:

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

Tuttavia, ho solo voglia di includere ogni coppia una volta (una combinazione al posto di una permutazione). Come dovrei ottenere il seguente:

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

hanno aggiunto il tag 'self-join' a quella risposta, questo è quello che ho cercato. – EoghanM

risposta

17

Modifica della condizione di join leggermente si ottenere quello che vuoi ..

Invece di:

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

uso

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

Questo includerà solo combinazioni in cui self.number è maggiore di mytable.number che in effetti limita i risultati a un ordinamento valido di ciascuna combinazione ...