Warum ist die Auswahl angegebene Spalten und alle, falsch in Oracle SQL?
-
22-09-2019 - |
Frage
sagen, ich habe eine select-Anweisung, die ..
gehtselect * from animals
Das gibt ein ein Abfrageergebnis aller Spalten in der Tabelle.
Wenn nun die 42. Spalte der Tabelle animals
ist is_parent
, und ich möchte, dass in meinen Ergebnissen zurückzukehren, kurz nach gender
, so dass ich es leichter zu sehen. Aber ich möchte auch alle anderen Spalten.
select is_parent, * from animals
Diese Erträge ORA-00936: missing expression
.
Die gleiche Aussage wird gut in Sybase arbeiten, und ich weiß, dass Sie eine Tabelle alias zum animals
Tabelle hinzufügen müssen, um es an die Arbeit (select is_parent, a.* from animals ani
), aber Warum muss Oracle benötigen Sie eine Tabelle alias zu können wählen arbeiten?
Lösung
Eigentlich ist es einfach, das ursprüngliche Problem zu lösen. Sie müssen nur die * qualifizieren.
select is_parent, animals.* from animals;
sollte gut funktionieren. Aliases für die Tabellennamen auch Arbeit.
Andere Tipps
Es ist kein Verdienst in diesen Code in der Produktion zu tun. Wir sollten explizit die Spalten nennen wir wollen, anstatt die SELECT * Konstrukt.
Wie für Ad-hoc-Abfragen, erhalten Sie sich ein IDE - SQL Developer, TOAD, PL / SQL Developer, usw. -, die uns Abfragen und Ergebnismengen manipulieren können, ohne SQL-Erweiterungen zu benötigen.
Gute Frage, ich habe oft diese selbst gewundert, aber haben sie dann als eines der Dinge akzeptiert ...
ähnliches Problem ist folgende:
sql>select geometrie.SDO_GTYPE from ngg_basiscomponent
ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier
Dabei gilt geometrie eine Spalte des Typs mdsys.sdo_geometry ist.
Fügen Sie einen Aliasnamen und das Ding funktioniert.
sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a;
Es gibt viele gute Antworten so weit auf, warum select *
sollte nicht verwendet werden, und sie sind alle vollkommen richtig. Allerdings glaube nicht, jeder von ihnen die ursprüngliche Frage beantworten, warum die besondere Syntax nicht.
Leider denke ich, der Grund dafür ist ... „weil es nicht“.
Ich glaube nicht, dass irgendetwas mit dem Single-Table zu tun vs. Multi-Table-Abfragen:
Dies funktioniert:
select *
from
person p inner join user u on u.person_id = p.person_id
Aber dies fehlschlägt:
select p.person_id, *
from
person p inner join user u on u.person_id = p.person_id
Während dieser Arbeiten:
select p.person_id, p.*, u.*
from
person p inner join user u on u.person_id = p.person_id
Es könnte einige historische Kompatibilität Sache mit 20 Jahre alten Legacy-Code sein.
Ein weiterer für den „Kauf warum !!!“ Eimer, zusammen mit warum können Sie Gruppe nicht durch eine alias ?
Der Anwendungsfall für die Alias. * Format wie folgt
select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id
Das heißt, die Auswahl all Spalten aus einer Tabelle in einem Join plus (optional) eine oder mehr Spalten aus anderen Tabellen.
Die Tatsache, dass Sie es verwenden, können die gleiche Spalte zweimal auszuwählen, ist nur ein Nebeneffekt. Es gibt keinen wirklichen Punkt die gleiche Spalte zweimal auf die Auswahl, und ich glaube nicht, Faulheit eine wirkliche Rechtfertigung ist.
Select *
in der realen Welt ist nur gefährlich, wenn sie in den Spalten nach Indexnummer nach dem Abrufen nicht namentlich genannt, das größere Problem Ineffizienz ist, wenn nicht alle Spalten in der Ergebnismenge erforderlich sind (Netzwerkverkehr, CPU und Speicherauslastung).
Natürlich, wenn Sie Spalten aus anderen Tabellen sind das Hinzufügen (wie in diesem Beispiel ist, kann es gefährlich sein, da diese Tabellen über die Zeit Spalten mit passenden Namen haben, select *, x
in diesem Fall würde fehlschlagen, wenn eine Spalte x in die Tabelle hinzugefügt wird dass bisher hat es nicht haben.
Warum muss Oracle benötigen eine Tabelle alias Lage sein, die wählen zu arbeiten
Teradata verlangt die gleiche. Da beide schon recht alt sind (vielleicht ist es besser, rufen Sie reifen :-) DBMSes könnte diese historische Gründe.
Meine übliche Erklärung ist. Mit einem uneingeschränkten *
Mittel alles / alle Spalten und der Parser / Optimierer ist einfach verwirrt, weil Sie fordern mehr als alles