Frage

sagen, ich habe eine select-Anweisung, die ..

geht
select * 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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top