2012-01-09 17 views
11

¿Cómo realizo una operación DISTINCT en una sola columna después de realizar una UNIÓN?SELECCIONE LA UNIÓN como DISTINCT

T1 
-- 
ID Value 
1 1 
2 2 
3 3 

T2 
-- 
ID Value 
1 2 
4 4 
5 5 


estoy tratando de devolver la tabla:

ID Value 
1 1 
2 2 
3 3 
4 4 
5 5 

me trataron:

SELECT DISTINCT ID, Value 
FROM (SELECT*FROM T1 UNION SELECT*FROM T2) AS T3 

Esto no parece funcionar.

+1

"Esto no parece funcionar." - ¿en qué manera? –

+0

No nos está dando todos los detalles, el valor siempre tendrá que ser el mismo que el campo 1, el valor mínimo, el valor máximo, el valor aleatorio ... Cualquier forma distinta se encuentra en todos los campos, no solo en un campo. –

+2

Consulte mi respuesta para obtener una mejor respuesta que la que seleccionó – Bohemian

Respuesta

15

Por lo que puedo decir, no hay "una columna distinct": distinct siempre se aplica a un registro completo (a menos que se utilice en un agregado como count(distinct name)). La razón para esto es que SQL no puede adivinar qué valores de Value le dejamos, y cuáles dejar caer. Eso es algo que debes definir por ti mismo.

Trate de usar GROUP BY para asegurar ID no se repite, y cualquier agregado (aquí MIN, como en el ejemplo que era el mínimo que sobrevivió) para seleccionar un valor particular de Value:

SELECT ID, min(Value) FROM (SELECT * FROM T1 UNION ALL SELECT * FROM T2) AS T3 
GROUP BY ID 

debe ser exactamente Que necesitas. Es decir, no es la misma consulta, y no hay distinct, pero es una consulta que devolvería lo que se muestra en el ejemplo.

+0

¿está seguro de que es la misma consulta? –

+0

Sugiero usar 'UNION ALL' en la subconsulta ya que no tiene sentido hacer un' DISTINCT' dos veces. –

+0

@MitchWheat Estoy seguro de que no es así, pero es una consulta que devolvería lo que se muestra en el ejemplo. – alf

25

¿Por qué está utilizando una subconsulta? Esto funcionará:

SELECT * FROM T1 
UNION 
SELECT * FROM T2 

UNION elimina duplicados. (UNION ALL no)

+0

El punto era, OP quería algo llamado "campo único DISTINCT", y no existe tal concepto. – alf

+1

Esta debe ser la respuesta aceptada. –

+0

Si UNION registra [1, 1] y [1, 2], obtendrá ambos en el conjunto de resultados. OP no quería repeticiones de la primera columna. Obviamente, esta respuesta fue útil para mucha gente, pero no creo que responda lo que se pidió. – user7733611

2

Esto -aunque este hilo es muy antiguo- podría ser una solución funcional para la cuestión del OP, aunque podría considerarse sucio.

Seleccionamos todas las tuplas de la primera tabla, y luego la agregamos (unimos) con las tuplas de la segunda tabla limitadas a aquellas que no tienen el campo específico correspondiente en la primera tabla.

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    Value NOT IN (SELECT Value FROM T1) 
); 
3

creo que eso es lo que quería decir:

SELECT * 
    FROM T1 
UNION 
SELECT * 
    FROM T2 
    WHERE (
    **ID 
** NOT IN (SELECT ID FROM T1) 
); 
+0

Realmente creo que esta debería ser la respuesta aceptada a la pregunta. Le permite priorizar en qué tabla se seleccionan los valores en lugar de hacer un MIN() con un GROUP BY. Depende de cómo OP quiera elegir el Valor. – user7733611

Cuestiones relacionadas