2009-08-25 8 views
42

Considerepar distinto de los valores de SQL

create table pairs (number a, number b) 

donde los datos se

1,1 
1,1 
1,1 
2,4 
2,4 
3,2 
3,2 
5,1 

Etc.

Lo que me da consulta los valores distintos de la columna número B tiene Así que puedo ver

1,1 
5,1 
2,4 
3,2 

solamente

He intentado

select distinct (a) , b from pairs group by b 

pero me da "no un grupo por la expresión"

Respuesta

56

Lo que quiere decir es o bien

SELECT DISTINCT a, b FROM pairs; 

o

SELECT a, b FROM pairs GROUP BY a, b; 
+3

Ahora que lo pienso, agrupar por cada columna es lo mismo que no agrupar por ninguna. Y me ganaste por 30 segundos. +1 – JamesMLV

+6

JamesMLV, agrupar por cada columna no es lo mismo que no agrupar por ninguna si tiene filas duplicadas. Considere la salida de 'SELECT a, b, count (*) FROM pairs'. –

+0

Oscar ahora me di cuenta de que mi consulta le dará una columna adicional para b = 1 (en realidad lo leí mal, sabiendo que quiere ambas columnas, asumí que desea filas distintas) ... –

9

Este le dará el resultado que está dando como e jemplo:

SELECT DISTINCT a, b 
FROM pairs 
4

si desea filtrar las tuplas se pueden utilizar en esta forma:

select distinct (case a > b then (a,b) else (b,a) end) from pairs 

lo bueno es que usted no tiene que utilizar por grupo.

+0

Tenía mucha esperanza de este método, pero sigo encontrando un error "ORA-00907: falta paréntesis derecho". ¿Cuáles son las reglas de sintaxis para ordenar las columnas por este método? – Chris

0

Si solo quiere un cuenta de los pares distintos.

La forma más sencilla de hacerlo es la siguiente SELECT COUNT(DISTINCT a,b) FROM pairs

Las soluciones anteriores serían una lista de todos los pares y luego se tendría que hacer una segunda consulta de contarlos.

9

Si desea quiera tratar a 1,2 y 2,1 como el mismo par, entonces esto le dará la lista única en MS-SQL:

SELECT DISTINCT 
    CASE WHEN a > b THEN a ELSE b END as a, 
    CASE WHEN a > b THEN b ELSE a END as b 
FROM pairs 

Inspirado por @meszias respuesta anterior

+0

por supuesto! sin embargo, estaba perplejo sobre cómo hacer esto antes de leer esta respuesta. Gracias. – Greg

Cuestiones relacionadas