2010-04-27 2 views

Antwort

18

Sie tun dies:

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

Also warum dies Ihre Frage nicht beantworten?

Lassen Sie uns die folgenden Daten prüfen (nur die ersten beiden Spalten):

content_name  Name 
XXXXX   1234 
XXXXX   5678 

SELECT DISTINCT bedeutet, dass Sie nur eine Zeile wollen, aber was wollen Sie für Name?

Was Sie tun müssen, ist, den Code neu schreiben GROUP BY zu verwenden und die entsprechenden Aggregatfunktion für die anderen Spalten auswählen:

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 

Nun, wahrscheinlich ist dies nicht produzieren, was Sie wollen entweder, aber eine Sache ist Sicherlich kann man die Datenbank-Engine nicht dazu bringen, "nur eine der Zeilen auszuwählen, die zurückgegeben werden sollen, mir ist es egal".

+0

+1 Gute Antwort. Haben Sie die Gruppe für content_name deaktiviert? –

+0

Ja, fügte es jetzt hinzu und formatierte das SQL ebenfalls neu. –

+0

Ich benutze auch diese Methode, aber ich fühle mich immer schmutzig dabei. Ist MIN und MAX hier wirklich das Richtige? Was verwenden andere Datenbanken wie mySQL und Oracle, mit denen Sie eine einzelne Spalte für das Schlüsselwort DISTINCT auswählen können? Machen sie hinter den Kulissen eine MIN/MAX? – emalamisura

1

Sie meinen so etwas wie

folgende
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

Dieser Weg ist viel besser als MINs in anderen Antworten, weil MIN unabhängig für jede Spalte berechnet werden, so dass Sie mit Zeilen enden würden, die in db nicht existieren – sparrow