2010-04-27 15 views

risposta

18

A tale scopo:

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

Allora perché questo non risponde alla tua domanda?

Prendiamo in considerazione i seguenti dati (solo le prime due colonne):

content_name  Name 
XXXXX   1234 
XXXXX   5678 

SELECT DISTINCT implica desideri solo una riga, ma cosa vuoi per il nome?

Quello che dovete fare è riscrivere il codice per utilizzare GROUP BY e scegliere la funzione di aggregazione appropriata per le altre colonne:

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 

Ora, probabilmente questo non produce ciò che si vuole sia, ma una cosa è per certo, non è possibile ingannare il motore del database semplicemente "scegliere una delle righe da restituire, non mi interessa quale."

+0

+1 Buona risposta. Hai lasciato il gruppo disattivato per content_name? –

+0

Sì, lo ha aggiunto ora e ha riformattato anche l'SQL. –

+0

Anche io uso questo metodo, ma mi sento sempre sporco a farlo. MIN e MAX sono davvero la cosa giusta da fare qui? Cosa utilizzano altri database come mySQL e Oracle che consentono di selezionare una singola colonna per la parola chiave DISTINCT? Stanno facendo un MIN/MAX dietro le quinte? – emalamisura

1

Vuoi dire qualcosa di simile a seguente

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

In questo modo è molto meglio che eseguire MIN in altre risposte perché MIN viene calcolato indipendentemente per ogni colonna in modo da finire con le righe che in realtà non esistono in db – sparrow

Problemi correlati