2011-09-17 25 views
8

Duplicar posibles:
combinations (not permutations) from cross join in sqlSQL: auto unirse usando cada fila una sola vez

Tengo actualmente una tabla con los siguientes registros:

A1 
A2 
A3 
B1 
B2 
C1 
C2 

Dónde la misma letra denota algunos criterios en común (por ejemplo, un valor común para la columna 'letra'). Yo hago un auto sumo en los criterios de la siguiente manera:

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

Esta unirse da algo como lo siguiente:

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

Sin embargo, yo sólo quiero incluir cada par una vez (una combinación en lugar de una permutación) ¿Cómo recibo el siguiente:

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

han agregado la etiqueta 'self-join' a esa respuesta, eso es lo que he buscado. – EoghanM

Respuesta

17

Cambio de la condición de unión ligeramente logrará lo que quiere ..

En lugar de:

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

uso

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

Este solo incluirá combinaciones donde self.number sea mayor que mytable.number que en efecto restringe los resultados a un orden válido de cada combinación ...