SQL Query Sintassi: Utilizzo tabella alias in un conteggio non è valido? Perché?
Domanda
Qualcuno potrebbe spiegare a me il motivo per cui la seguente query non è valido? Io corro questa query di database Oracle 10g.
select count(test.*) from my_table test;
ottengo il seguente errore: ORA-01747: user.table.column non valida, table.column, o una specifica colonna
ma , i seguenti due query sono validi.
select count(test.column) from my_table test;
select test.* from my_table test;
Soluzione
COUNT(expression)
conteranno tutte le righe dove expression
non è nullo. COUNT(*)
è un'eccezione, restituisce il numero di righe:. *
non è un alias per my_table.*
Altri suggerimenti
Per quanto ne so, Count(Table.*)
non è ufficialmente supportata nella specifica SQL. Solo Count(*)
(contare tutte le righe restituite) e Count(Table.ColumnName)
(contare tutti i valori non nulli nella colonna data). Quindi, anche se il DBMS supportati esso, mi sento di raccomandare di non utilizzare it.`
Questa sintassi funziona solo in PostgreSQL
e solo perché ha un tipo di dati di registrazione (per il quale test.*
è un'espressione significativa).
Basta usare COUNT(*)
.
Questa query:
select count(test.column) from my_table test;
restituirà il numero di record per i quali non è test.column
NULL
.
Questa query:
select test.* from my_table test;
sarà solo ti restituirà tutti i record da my_table
.
COUNT
come tale è probabilmente l'unico aggregato che ha senso senza parametri, e usando un'espressione come COUNT(*)
è solo un modo per chiamare una funzione senza fornire parametri attuali ad esso.
Si può voler trovare il numero di record in cui test.column non è nullo, se si sta facendo un outer join. Come ogni tavolo dovrebbe avere una PK (che non è nullo) si dovrebbe essere in grado di contare le righe del genere, se si desidera:
select count(y.pk)
from x
left outer join y on y.pk = x.ck
COUNT (*) non va bene qui perché il join esterno sta creando una riga nullo per la tabella che è carente nelle informazioni.