2016-04-10 4 views
1

Ich fange gerade an, SQL zu lernen, und ich habe einige Schwierigkeiten beim Schreiben von Unterabfragen in der FROM-Klausel.Warum werden meine Tabellenspalten bei Verwendung einer FROM-Unterabfrage in Oracle nicht erkannt?

Zum Beispiel versuche ich eine Abfrage zu schreiben, die den Vornamen, den Nachnamen und das Einstellungsdatum für die letzte Miete in der Mitarbeitertabelle zurückgibt.

Ich habe alle meine Notizen durchgesehen und online gesucht, und ich kann einfach nicht verstehen, was ich vermasselt habe. Ich muss eine Unterabfrage in eine von Klausel

select emp_lname, emp_fname, mosthire 
from (select min(emp_hiredate) as mosthire 
from employee) recenthire; 

verwenden Jedes Mal, wenn ich diese laufen, bekomme ich diesen Fehler:

ORA-00904: "EMP_FNAME": invalid identifier 
00904. 00000 - "%s: invalid identifier" 

ich alles richtig geschrieben haben. Könnte jemand beschreiben, was ich vermasseln könnte? Vielen Dank!

Antwort

1

Wie in Grundarithmetik, beginnen die inneren Klammern (in SQL, das ist die „Unterabfrage“ in Klammern):

select min(emp_hiredate) as mosthire from employee 

Das Ergebnis dieser Unterabfrage ist eine „Tabelle“ mit einer einzigen Kolonne, Mosthire. Dann versuchen Sie in Ihrer äußeren Abfrage, aus dieser inneren Abfrage auszuwählen, aber Sie versuchen, emp_lname und emp_fname aus dieser einspaltigen "Tabelle" auszuwählen. Das kann nicht passieren. emp_fname ist ein ungültiger Spaltenname für die Unterabfrage - das sagt Ihnen die Fehlermeldung.

Auch ist es nicht klar, dass Sie wirklich wollten, dass die innere Abfrage so ist; Sie wählen das früheste Einstellungsdatum unter ALLE MITARBEITER aus: Das Ergebnis wird nicht nur eine Spalte, sondern auch eine einzelne Zeile haben. Stattdessen wollte man wahrscheinlich eine erweiterte Abfrage, die „Gruppe“ Klausel:

select emp_lname, emp_fname, min(emp_hiredate) as recenthire 
from employee 
group by emp_id 

(Tisches unter der Annahme hat eine Spalte emp_id, andernfalls vielleicht die letzte Zeile von emp_lname zu einer Gruppe ändern, emp_fname, obwohl Daten können sicherlich mehr als einen Mitarbeiter mit dem Namen John Smith).

... obwohl Sie jetzt neu lesen, vielleicht versuchen Sie nur, die neueste Einstellung aller Mitarbeiter abzuholen? Das ist eine andere Frage ... und Sie fragen sich, warum Sie min (hire_date) und nicht max (hire_date) wählen. In diesem Fall möchten Sie wahrscheinlich (etwas näher an Ihrem ersten Versuch):

select emp_lname, emp_fname, emp_hiredate 
from employee 
where emp_hiredate = (select max(emp_hiredate) from employee) 
Verwandte Themen