Domanda

Supponiamo che io abbia un'istruzione select che va...

select * from animals

Ciò fornisce un risultato della query di tutte le colonne nella tabella.

Ora, se la 42a colonna della tabella animals È is_parent, e voglio restituirlo nei miei risultati, subito dopo gender, così posso vederlo più facilmente.Ma voglio anche tutte le altre colonne.

select is_parent, * from animals

Questo ritorna ORA-00936: missing expression.

La stessa istruzione funzionerà bene in Sybase e so che è necessario aggiungere un alias di tabella al file animals tabella per farlo funzionare ( select is_parent, a.* from animals ani), Ma Perché Oracle deve aver bisogno di un alias di tabella per poter elaborare la selezione?

È stato utile?

Soluzione

In realtà, è facile risolvere il problema originale.Devi solo qualificare il file *.

select is_parent, animals.* from animals;

dovrebbe funzionare bene.Funzionano anche gli alias per i nomi delle tabelle.

Altri suggerimenti

Non c'è alcun merito nel fare questo nel codice di produzione. Dovremmo nominare esplicitamente le colonne che vogliamo, piuttosto che utilizzare il * costrutto SELECT.

Per quanto riguarda l'interrogazione ad hoc, farti un IDE - SQL Developer, ROSPO, Developer PL / SQL, ecc - che ci permette di manipolare le query e Set di risultati senza bisogno di estensioni a SQL.

Buona domanda, mi sono spesso chiesto io stesso, ma hanno poi accettato come una di quelle cose ...

problema simile è questo:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

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

dove geometrie è una colonna di tipo mdsys.sdo_geometry.

Aggiungi un alias e la cosa funziona.

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

Un sacco di buone risposte finora sul perché select * non deve essere utilizzato e sono tutti perfettamente corretto. Tuttavia, non credo che nessuno di loro rispondere alla domanda iniziale sul perché la sintassi particolare fallisce.

Purtroppo, penso che il motivo è ... "perché non è così".

Non credo che sia qualcosa a che fare con il tavolo singolo vs. query multi-tavolo:

Questo funziona bene:

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

Ma questo non riesce:

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

Anche se questo funziona:

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

Potrebbe essere qualche cosa compatibilità storica con 20 anni di età il codice legacy.

Un altro per il "buy perché !!!" secchio, insieme a perché non si può da un gruppo alias ?

Il caso d'uso per l'alias. * Formato è il seguente

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

Cioè, selezionando tutte le colonne da una tabella in un join, più (opzionalmente) una o più colonne di altre tabelle.

Il fatto che si può utilizzare per selezionare la stessa colonna per due volte è solo un effetto collaterale. Non esiste un vero punto di selezione della stessa colonna due volte e non credo che la pigrizia è una vera giustificazione.

Select * nel mondo reale è pericoloso solo quando si parla di colonne per numero di indice, dopo il recupero, piuttosto che in base al nome, il problema più grande è l'inefficienza quando non tutte le colonne sono tenuti nel set di risultati (il traffico di rete, CPU e carico di memoria). Naturalmente se si sta aggiungendo le colonne da altre tabelle (come è il caso in questo esempio può essere pericoloso in quanto queste tabelle possono avere nel corso del tempo le colonne con nomi corrispondenti, select *, x in quel caso avrebbe fallito se una colonna x viene aggiunto alla tabella che prima non ce l'ha.

  

perché deve Oracle ha bisogno di un alias di tabella per essere in grado di elaborare il select

Teradata sta richiedendo lo stesso. In quanto entrambi sono piuttosto vecchio (forse meglio chiamarlo maturare DBMS :-) Questo potrebbe essere ragioni storiche.

La mia solita spiegazione è:. Un * qualificato mezzi tutto / tutte le colonne e il parser / ottimizzatore è semplicemente confuso perché si richiede più di tutto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top