2016-04-01 13 views
0

Ich habe Probleme mit der folgenden SQL-Abfrage:Verschachtelte SQL Query

SELECT job 
FROM (SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job) 
WHERE cnt=1 

Als Ergebnis sollte es nur alle Jobs zeigt, wo cnt (Anzahl der Jobs) gleich 1.
Wenn ich die Auswahlabfrage testen oben auf Fiddle, bekomme ich folgende Fehlermeldung:

Incorrect syntax near the keyword 'WHERE'. 

SQLFiddle: http://sqlfiddle.com/#!6/d812a/7

+0

http://sqlfiddle.com/#!6/d812a/15 – Strawberry

+0

Ist das erwartete Ergebnis Bäcker und Gärtner? – Loufylouf

+0

Sie könnten auch HAVING verwenden, was die äußere Abfrage redundant machen würde – Strawberry

Antwort

1

Keine Notwendigkeit, die Komplexität zu erhöhen, indem sie Unter Abfrage verwenden, wenn es nicht

SELECT job, count(job) 
FROM Employee 
GROUP BY job 
having count(job)=1; 
+0

Danke - das sieht wirklich einfach aus. :) – CallMeBronxy

0

Sie vergessen, den Aliasnamen hinzuzufügen. Bitte ändern Sie die Abfrage wie diese

SELECT job 
FROM (SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job) As MyTable 
WHERE cnt=1 

Sie sollten den Alias-Namen für die innere Abfrage zu geben haben, wenn Sie die Auswahl verwenden und wo Klauseln außerhalb.

+0

Wusste das nicht. Danke, dass du es erwähnt hast - aber ich denke, ich werde HAVING-Clausel dafür benutzen. – CallMeBronxy

+0

Das ist in Ordnung und es ist anders als das, was Sie gefragt haben. Ich habe deine Suchanfrage korrigiert. und wenn es funktioniert und wenn es die direkte Antwort auf deine Frage ist, dann upvote und akzeptiere. Überprüfen Sie die Frage, die gefragt haben, nicht die alternative Lösung richtig? –

+0

Sie haben Recht, ich würde upvote, wenn ich genug Reputationspunkte habe. – CallMeBronxy

0

Sie sollten verwenden, um die HAVING Klausel erforderlich ist, die für diese Art der Sache geschieht. Ihre Anfrage wird einfach sein:

SELECT job FROM Employee GROUP BY job 
HAVING COUNT(id)=1 

Die Dokumentation besagt, dass

Der SQL-Standard verlangt, dass mit nur Spalten in die GROUP BY-Klausel oder Spalten in Aggregatfunktionen verwendet, verweisen muss. Jedoch unterstützt MySQL eine Erweiterung dieses Verhaltens und erlaubt, dass sich HAVING auf auf Spalten in der SELECT-Liste und Spalten in äußeren Unterabfragen wie gut bezieht.

Die wichtige Sache zu beachten ist, dass im Gegensatz zu der WHERE Klausel können Sie Aggregat funcitons verwenden (wie Zahl, max, min ...) in der HAVING Klausel.

1

Sie müssen Aliasnamen der verschachtelten Abfrage sollte

SELECT A.job 
FROM (SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job)A 
WHERE A.cnt=1 
0

Sie die HAVING Syntax zur Verfügung zu stellen:

SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job 
HAVING cnt = 1; 
+0

Funktioniert nicht, es gibt einen Fehler zurück. Die Aggregatfunktion sollte direkt in der 'HAVING'-Klausel verwendet werden. – Loufylouf

+0

Es hängt von Ihrem SQL-Modus ab.Wenn Sie 'ONLY_FULL_GROUP_BY' deaktiviert haben, sollte es funktionieren. –