Pourquoi la sélection des colonnes spécifiées, et tout, est-elle erronée dans Oracle SQL ?

StackOverflow https://stackoverflow.com/questions/2315295

Question

Disons que j'ai une instruction select qui va ..

select * from animals

Cela donne un résultat de requête sur toutes les colonnes de la table.

Maintenant, si la 42ème colonne du tableau animals est is_parent, et je souhaite renvoyer cela dans mes résultats, juste après gender, pour que je puisse le voir plus facilement.Mais je veux aussi toutes les autres colonnes.

select is_parent, * from animals

Cela revient ORA-00936: missing expression.

La même instruction fonctionnera correctement dans Sybase, et je sais que vous devez ajouter un alias de table au animals table pour le faire fonctionner ( select is_parent, a.* from animals ani), mais pourquoi Oracle doit-il avoir besoin d'un alias de table pour pouvoir effectuer la sélection ?

Était-ce utile?

La solution

En fait, il est facile de résoudre le problème initial.Il suffit de qualifier le *.

select is_parent, animals.* from animals;

devrait fonctionner très bien.Les alias pour les noms de tables fonctionnent également.

Autres conseils

Il n'y a pas de mérite à le faire dans le code de production. Nous devons nommer explicitement les colonnes que nous voulons plutôt que d'utiliser la construction SELECT *.

En ce qui concerne des requêtes ad hoc, vous obtenez un IDE - Développeur SQL, TOAD, PL / SQL Developer, etc. - qui nous permet de manipuler des requêtes et des ensembles de résultats sans avoir besoin de SQL extensions.

Bonne question, je me suis souvent demandé moi-même, mais ont ensuite accepté comme une de ces choses ...

problème similaire est la suivante:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier

où geometrie est une colonne de type mdsys.sdo_geometry.

Ajoutez un alias et la chose fonctionne.

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a;

Beaucoup de bonnes réponses à ce jour sur les raisons select * ne doit pas être utilisé et ils sont tous parfaitement correct. Cependant, ne pense pas que l'un d'eux répondre à la question initiale pourquoi la syntaxe particulière échoue.

Malheureusement, je pense que la raison est ... « parce qu'il ne ».

Je ne pense pas que ce soit quelque chose à voir avec une seule table de requêtes par rapport à plusieurs tables:

Cela fonctionne bien:

select *
from
    person p inner join user u on u.person_id = p.person_id

Mais cela ne fonctionne pas:

select p.person_id, *
from
    person p inner join user u on u.person_id = p.person_id

Bien que cela fonctionne:

select p.person_id, p.*, u.*
from
    person p inner join user u on u.person_id = p.person_id

Il est peut-être quelque chose de compatibilité historique avec l'ancien code existant de 20 ans.

Une autre pour le « pourquoi acheter !!! » seau, ainsi que pourquoi pas vous groupez par un alias ?

Le cas d'utilisation pour l'alias. * Le format est le suivant

select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id

C'est, sélectionner toutes les colonnes d'une table dans une jointure, plus (éventuellement) une ou plusieurs colonnes d'autres tables.

Le fait que vous pouvez l'utiliser pour sélectionner la même colonne est deux fois juste un effet secondaire. Il n'y a pas de véritable point de choisir la même colonne deux fois et je ne pense pas que la paresse est une justification réelle.

Select * dans le monde réel est seulement dangereux en se référant à des colonnes par numéro d'index après la récupération plutôt que par son nom, le plus gros problème est l'inefficacité lorsque toutes les colonnes sont nécessaires dans le resultset (trafic réseau, cpu et charge de la mémoire). Bien sûr, si vous ajoutez des colonnes d'autres tables (comme est le cas dans cet exemple, il peut être dangereux car ces tableaux au fil du temps ont des colonnes avec des noms correspondant, select *, x dans ce cas serait un échec si une colonne x est ajoutée à la table qui ne auparavant pas avoir.

  

pourquoi doit Oracle ont besoin d'un alias de table pour pouvoir travailler la sélection

Teradata exige la même chose. Comme les deux sont assez vieux (peut-être mieux l'appeler matures :-) DBMSes cela pourrait être des raisons historiques.

Mon explication habituelle est:. Un moyen * non qualifié tout / toutes les colonnes et l'analyseur / optimiseur est tout simplement confus parce que vous demandez plus que tout

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top