Warum werden bestimmte Spalten in Oracle SQL falsch ausgewählt?
Sagen, ich habe eine select-Anweisung, die geht..
select * from animals
Gibt einen einen Abfrage-Ergebnis alle Spalten in der Tabelle.
Nun, wenn die 42nd Spalte der Tabelle animals
ist is_parent
und ich will zurückkehren in meine Ergebnisse, nur nach gender
so kann ich sehen es einfach mehr. Ich möchte aber auch alle anderen Spalten.
select is_parent, * from animals
Zurück ORA-00936: missing expression
.
Derselben Anweisung funktioniert bei Sybase, und ich weiß, dass Sie brauchen, um eine Tabelle hinzuzufügen alias animals
Tabelle, um es zu arbeiten ( select is_parent, a.* from animals ani
), aber warum muss Oracle müssen Sie eine alias-Tabelle in der Lage sein, um die wählen Sie?
InformationsquelleAutor der Frage glasnt | 2010-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich ist es ganz einfach zu lösen das ursprüngliche problem. Sie müssen nur qualifizieren, die *.
sollte gut funktionieren. Aliase für den Tabellennamen auch funktionieren.
InformationsquelleAutor der Antwort Jim Hudson
Es ist kein Verdienst dabei in der Produktion von code. Sollten wir explizit den Namen der Spalten, die wir wollen, anstatt mit dem SELECT * zu konstruieren.
Als für die ad-hoc-Abfragen, erhalten Sie eine IDE - SQL-Developer, TOAD, PL/SQL Developer, etc - was uns erlaubt, uns zu manipulieren, Abfragen und Ergebnismengen, ohne Erweiterungen zu SQL.
InformationsquelleAutor der Antwort APC
Gute Frage, ich habe mich oft gefragt, diese mich aber dann akzeptiert es als eines dieser Dinge...
Ähnliches problem ist dieses:
wo geometrie ist eine Spalte vom Typ mdsys.sdo_geometry.
Fügen Sie einen alias hinzu und das Ding funktioniert.
InformationsquelleAutor der Antwort Rene
Viele gute Antworten bisher, warum
select *
sollte nicht verwendet werden, und Sie sind alle vollkommen richtig. Aber glaube nicht, dass einer von Ihnen Antwort auf die ursprüngliche Frage, warum ein bestimmtes syntax-Fehler.Leider, ich glaube, der Grund ist... ", weil es nicht".
Ich glaube nicht, dass es etwas zu tun mit single-table vs. multi-table-Abfragen:
Dieser gut funktioniert:
Aber dies schlägt fehl:
Während das funktioniert:
Könnte es werden einige historische Kompatibilität Sache mit den 20 Jahre alten legacy-code.
Anderen für die "kaufen, warum!!!" Eimer, zusammen mit warum können nicht Sie die Gruppe, indem Sie ein alias?
InformationsquelleAutor der Antwort Nick Pierpoint
Den Anwendungsfall, für den alias ein.* format ist wie folgt
Ist, wählen Sie alle Spalten aus einer Tabelle in einer join-plus (Optional) eine oder mehrere Spalten aus anderen Tabellen.
Die Tatsache, dass Sie können es verwenden, um wählen Sie die gleiche Spalte doppelt ist nur ein Nebeneffekt. Es ist kein echter Punkt, um die Auswahl in derselben Spalte zweimal und ich denke nicht, dass Faulheit ist eine wirkliche Rechtfertigung.
InformationsquelleAutor der Antwort Gary Myers
Select *
in der realen Welt ist nur dann gefährlich, wenn auf die Spalten-index-Nummer nach Abruf und nicht nach Namen, das größere problem ist die Ineffizienz, wenn nicht alle Spalten benötigt werden, in die Ergebnismenge (Netzwerk-traffic, cpu-und Speicherauslastung).Natürlich, wenn Sie das hinzufügen von Spalten aus anderen Tabellen (wie in diesem Beispiel, es kann gefährlich sein, da diese Tabellen können im Laufe der Zeit die Spalten mit übereinstimmenden Namen,
select *, x
in diesem Fall schlägt fehl, wenn eine Spalte x der Tabelle Hinzugefügt wird, die zuvor nicht hatten.InformationsquelleAutor der Antwort jwenting
Teradata erfordert die gleiche. Denn beide sind schon ziemlich alt (vielleicht besser nennen es Reifen 🙂 DBMS könnte dies historische Gründe.
Meine übliche Erklärung ist: eine unqualifizierte
*
bedeutet alles/alle Spalten und der parser/optimizer ist einfach verwirrt, weil Sie verlangen mehr als alles.InformationsquelleAutor der Antwort dnoeth