2010-04-27 5 views

Respuesta

18

Para ello:

SELECT DISTINCT Content.content_name 
FROM Language AS Language2 
LEFT JOIN contents AS Content ON (Language2.language_id = Content.language_id) 

Entonces, ¿por qué esto no responde a su pregunta?

Consideremos los siguientes datos (sólo las primeras dos columnas):

content_name  Name 
XXXXX   1234 
XXXXX   5678 

SELECT DISTINCT implica sólo desea una fila, pero ¿qué es lo que quiere para Nombre?

Lo que hay que hacer es volver a escribir el código para utilizar GROUP BY y elegir la función de agregado apropiado para las otras columnas:

SELECT 
    Content.content_name, 
    MIN(Language2.Name) AS Name, 
    MIN(Language2.language_id) AS language_id, 
    MIN(Content.id) AS id, 
    MIN(Content.content_description) AS content_description, 
FROM 
    Language AS Language2 
    LEFT JOIN contents AS Content 
     ON (Language2.language_id = Content.language_id) 
GROUP BY 
    Content.content_name 

Ahora, probablemente esto no produce lo que quiere tampoco, pero una cosa es por cierto, no se puede engañar al motor de la base de datos para que simplemente "seleccione una de las filas para devolver, no me importa cuál".

+0

+1 Buena respuesta. ¿Saliste del grupo por el content_name? –

+0

Sí, lo agregué ahora y reformateé el SQL también. –

+0

También uso este método pero siempre me siento sucio haciéndolo. ¿MIN y MAX realmente son lo correcto para hacer aquí? ¿Qué usan otras bases de datos como mySQL y Oracle que le permiten seleccionar una sola columna para la palabra clave DISTINCT? ¿Están haciendo un MIN/MAX detrás de las escenas? – emalamisura

1

¿Quieres decir algo como siguiente

SELECT Content.content_name, 
FROM Language AS Language2 
LEFT JOIN contents AS Content ON (Language2.language_id = Content.language_id) 
Group by Content.content_name 
4
WITH q AS 
     (
     SELECT Content.content_name, Language2.Name, Language2.language_id, Content.id, Content.content_description, ROW_NUMBER() OVER (PARTITION BY content_name ORDER BY language_id) AS rn 
     FROM Language Language2 
     LEFT JOIN 
       Contents AS Content 
     ON  Language2.language_id = Content.language_id 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 
+0

De esta manera es mucho mejor que hacer MINs en otras respuestas porque MIN se calcula de forma independiente para cada columna, por lo que terminaría con filas que en realidad no existen en db – sparrow

Cuestiones relacionadas