2010-11-21 9 views
1

Ich habe ein Problem mit distinct mit *. Ich habe eine Tabelle, die als Join und ich versuche, wie eine Aussage zu machen:Mit Distinct mit *

SELECT DISTINCT Name, * FROM table_a JOIN table_a.id=table_b.id WHERE status=1 

Aber es ist nicht erlaubt mir, dies zu tun. Gibt es eine Möglichkeit, Distinct mit * Option zu verwenden?

+1

Welche SQL-Dialekt sprechen wir? Sind Sie sicher, dass die DISTINCT das Problem ist und nicht der 'Name, *' Teil? –

+0

Warum ist dies mit "mysql" und "postgresql" markiert? –

+0

Was ist die Fehlermeldung? – JJJ

Antwort

1

Ich habe keinen Zugriff dieses Recht jetzt zu testen, aber ich vermute, dass das Problem nicht mit distinct ist, sondern, dass Sie Spalt in jeder Tabelle mit den gleichen Namen (wie id) und sie nicht wissen, was der beiden widersprüchlichen Spalten zu wählen. Ändert es sich, wenn Sie select distinct table_a.*, table_b.* ... tun?

+0

Mit select distinct table_a. *, Table_b. * Wird kein Fehler mehr erzeugt, aber wenn ich das tue, funktioniert distinct auch nicht –

+0

@Devin - Wählen Sie dann die Spalten, die Sie eindeutig auswählen möchten, und listen Sie sie auf, anstatt '*' zu verwenden. – tvanfosson

+0

Ok ich habe es, danke! –

1

DISTINCT * wahrscheinlich werden alle Zeilen zurück, weil sie

Um alle verschiedenen Namen DISTINCT name verwenden verschiedene :-) sind oder einige Statistiken über Namen (z count) SELECT name, COUNT(*) FROM ... GROUP BY name verwenden abzurufen.

0

Es ist nicht klar, was Sie tun möchten.

Vielleicht möchten Sie nur eine Spalte mit einem bestimmten Namen (nicht zwei ID-Spalten) zurückgeben.

In diesem Fall wird die Standard-SQL-Abfrage wie folgt lautet:

SELECT * FROM table_a JOIN table_b USING (id) WHERE status=1 

Das Schlüsselwort DISTINCT bedeutet, dass die Auswahl nach der Durchführung, doppelten Zeilen eliminiert werden (keine Spaltennamen duplizieren).

0

Grundsätzlich ist die Lösung ist wie folgt aus:

SELECT * 
FROM table_a, table_b 
JOIN table_a.id = table_b.id 
WHERE status = 1 
GROUP BY table_a.name 

Dies ist nützlich, wenn Sie die Aufzählung der Eigenschaften zu vermeiden. Wenn Sie dies tun und sich die Beziehung ändert (ein Attribut wird entfernt oder hinzugefügt), funktioniert Ihre Abfrage nicht.

Lesen Sie dies: MySQL 8.3.1.13. DISTINCT Optimization

+0

Das ist eine sehr alte Frage! Ihre Syntax ist nicht gültig (Hinweis: sollte nicht Ihre 'FROM'-Klausel eine Tabelle mit dem Namen' table_b' enthalten?) Ich vermute, die Antwort war 'SELECT * FROM table_a NATURAL JOIN tabelle_b WHERE status = 1;' – onedaywhen

+0

@onedaywhen: Entschuldigung, Ich habe gerade das fehlende Lexikal überarbeitet. Was meinst du mit der Antwort? Die angenommene Antwort funktioniert nicht, und es löst nicht das Problem mit "DISTINCT", wenn Sie '*' verwenden. – Dyin

+0

Ihre überarbeitete Abfrage gibt doppelte Spalten zurück. Ich kann natürlich nur raten, aber ich denke, dass die OP bestimmte Spalten (und nicht einzelne Zeilen) haben wollte und "NATURAL JOIN" ist ein guter Weg, das zu erreichen. – onedaywhen