Pourquoi est-sélection des colonnes spécifiées, et toutes les, mal dans Oracle SQL?
Dire que j'ai une instruction select qui va..
select * from animals
Qui donne un résultat d'une requête de toutes les colonnes dans la table.
Maintenant, si la 42e de la colonne de la table animals
est is_parent
, et je veux rentrer dans mes résultats, juste après gender
, afin que je puisse le voir plus facilement. Mais je veux aussi toutes les autres colonnes.
select is_parent, * from animals
Cela renvoie ORA-00936: missing expression
.
La même déclaration bien fonctionner dans Sybase, et je sais que vous avez besoin pour ajouter un alias de la table à la animals
table pour le faire fonctionner ( select is_parent, a.* from animals ani
), mais pourquoi doit Oracle besoin d'un alias de la table pour être en mesure de travailler sur les sélectionner?
- Merci pour cette question. Je suis la transition à partir de SQL Server vers Oracle. Je vois la même erreur.
Vous devez vous connecter pour publier un commentaire.
En fait, il est facile de résoudre le problème d'origine. Vous avez juste à qualifier l' *.
devrait fonctionner parfaitement. Alias pour les noms de table également.
Il n'y a pas de mérite à le faire dans le code de production. Nous avons explicitement le nom des colonnes que nous voulons plutôt que d'utiliser le SELECT * construire.
Que pour des requêtes ad hoc, procurez-vous une IDE - SQL Developer, CRAPAUD, PL/SQL Developer, etc - ce qui nous permet de manipuler des requêtes et des ensembles de résultats sans avoir besoin d'extensions de SQL.
Select *
dans le monde réel est en effet dangereux. J'ai été pris avant lorsque les colonnes sont ajoutées et*
est utilisé dans les procédures. Toutefois, pour des requêtes spécifiques, mon intervention était tout à fait valable.Bonne question, je me suis souvent demandé ce moi-même, mais ont ensuite accepté comme une de ces choses...
Problème similaire est ceci:
où geometrie est une colonne de type mdsys.sdo_geometry.
Ajouter un alias et la chose fonctionne.
Beaucoup de bonnes réponses sur pourquoi
select *
ne devrait pas être utilisé et ils sont tous parfaitement correcte. Cependant, ne pensez pas tout de répondre à la question d'origine sur les raisons de la syntaxe particulière échoue.Malheureusement, je pense que la raison en est... "car il n'a pas".
Je ne pense pas que c'est rien de le faire avec une seule table et plusieurs requêtes de table:
Cela fonctionne bien:
Mais cela échoue:
Alors que cela fonctionne:
Il pourrait être un certain historique de la compatibilité chose avec les 20 ans du code legacy.
Une autre pour le "buy pourquoi!!!" seau, avec pourquoi ne pouvez-vous pas groupe par un alias?
Le cas d'utilisation de l'alias.* le format est comme suit
Qui est, la sélection de toutes les colonnes d'une table dans une jointure, et (éventuellement) une ou plusieurs colonnes à partir d'autres tables.
Le fait que vous pouvez l'utiliser pour sélectionner la même colonne deux fois, c'est juste un effet secondaire. Il n'y a pas de véritable point de la sélection de la même colonne deux fois et je ne pense pas que la paresse est un véritable justification.
select column, *
utilisée lors du débogage permet de gagner du temps par rapport à essayer de copier les colonnes et le portage dans Excel, déplacer manuellement les colonnes autour des avec le risque de pas datacolumns.Select *
dans le monde réel est dangereux uniquement en se référant à des colonnes par numéro d'index après la récupération plutôt que par le nom, le plus gros problème est l'inefficacité lorsqu'il n'est pas toutes les colonnes qui sont nécessaires dans le jeu de résultats (trafic réseau, cpu et de la mémoire de la charge).Bien sûr, si vous êtes l'ajout de colonnes à partir d'autres tables (comme c'est le cas dans cet exemple, il peut être dangereux, car ces tables peuvent au fil du temps avoir des colonnes avec les noms correspondants,
select *, x
dans ce cas serait un échec si une colonne de x est ajoutée à la table qui, auparavant, n'existait pas.Teradata est exigeant les mêmes. Comme les deux sont assez vieux (peut-être mieux appeler mature 🙂 DBMSes cela peut être des raisons historiques.
Mon explication habituelle est: un franc
*
signifie tout/toutes les colonnes et de l'analyseur/optimizer est tout simplement confondu parce que vous demande plus que tout.