Si preservar el orden de los elementos en cada "par" es no importante, ver la respuesta de eggyal. Esa consulta devuelve un conjunto de resultados que es ligeramente diferente al que usted especificó, devuelve el par 102-987
en lugar de 987-102
. También elimina los pares "duplicados" que aparecen en la tabla.
Si preservar el orden de los elementos en cada par es importante, y desea devolver el "menor - más grande" en lugar de "más grande - más pequeño" cuando ambos pares "coincidentes" están presentes, el puede usar algo como esto:
SELECT c.col1, c.col2
FROM mytable c
LEFT
JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
WHERE (d.col1 IS NULL OR d.col1 > c.col1)
Para eliminar todos los pares duplicados y los pares de "igualación", añadir una cláusula GROUP BY o la palabra clave DISTINCT, por ejemplo,
SELECT c.col1, c.col2
FROM mytable c
LEFT
JOIN mytable d ON d.col1 = c.col2 AND d.col2 = c.col1 AND d.col1 <> d.col2
WHERE (d.col1 IS NULL OR d.col1 > c.col1)
GROUP BY c.col1, c.col2
NOTAS:
SQL violín aquí: http://sqlfiddle.com/#!2/1d9e7/1 y aquí: http://sqlfiddle.com/#!2/1d9e7/2
Los operadores de comparación no son nulos de fallos, es posible que no devuelven el conjunto de resultados que desea cuando sea col1 o col2 contiene un valor NULL (La consulta podría modificarse para manejar valores NULL para col1 y/o col2). Como está escrito, ambas consultas regresarían, por ejemplo, tanto (1,NULL)
como (NULL,1)
si esos "pares" "coincidentes" están en la tabla. (Todo se reduce a la cuestión de si desea considerar valores NULOS para coincidir o no).
También tenga en cuenta que ambas consultas devolverán filas donde col1=col2
.
Tenga en cuenta que la primera consulta NO elimina las filas "duplicadas" que existen en la tabla. Es decir, si un "par" duplicado, por ejemplo, (202,101)
aparece en dos filas diferentes, se devolverán ambos (a menos que la consulta devuelva al menos una fila con un par "coincidente": (101,202)
.)
No estaba claro qué conjunto de resultados quería devolver en esos casos, por lo que la primera consulta muestra el patrón para eliminar SOLAMENTE las filas (larger,smaller)
cuando un par coincidente (smaller,larger)
está en el conjunto de resultados.
La segunda consulta elimina TODOS los duplicados y pares "coincidentes".
nosotros su estructura de tabla muestran –
int person_id (10), int question_id (10) de texto TEXT_ANSWER, creo segundo colomn no es necesario, ya que en esa pregunta, lo uso en la cláusula WHERE –