2013-06-19 3 views
17

In usano spesso in TSQL la seguente query:Come selezionare tutte le colonne, e un conteggio (*) nella stessa query

SELECT COUNT(*), * 
FROM CUSTOMER c 
WHERE c.Name like 'foo%'; 

Quando provo ad eseguire questa query in Oracle SQL Developer non è così lavoro e mi getta un errore:

"Missing expression"

Qual è la buona sintassi?

Grazie in anticipo.

+0

si dovrà utilizzare gruppo da .. o combinare il risultato di due query. –

+1

Plz fornisce lo schema della tabella. –

+0

Non credo che l'istruzione funzioni in SQL Server –

risposta

4

Un approccio è fare qualcosa come il seguente. Ciò comporterà un risultato di conteggio (*) per ogni riga. Ma attenzione, c'è un Cartesianjoin; se hai molte righe come "pippo%", questo si comporta male.

select a.cntr, c.* 
from CUSTOMER c 
    , (select count(*) cntr 
    from customer b 
    where b.name like 'foo%') a 
where c.name like 'foo%' 
34

Questo avrà un rendimento migliore:

SELECT COUNT(*) OVER(), c.* 
FROM CUSTOMER c 
WHERE c.Name like 'foo%'; 
+7

spiegazione sarebbe stata piacevole – Blauhirn

+2

@Blauhim, è una funzione analitica con una clausola di finestra vuota - quindi calcola il conteggio delle righe sull'intero set di risultati. Di solito ha un rendimento migliore, perché dovrebbe visitare solo ogni blocco del tavolo una volta, contando le righe man mano che procede. –

+0

@Jeffrey Questo è bello, ma le colonne extra per ogni riga che crea tendono a causare un sovraccarico maggiore di un conteggio selezionato (*), soprattutto se si dispone di un aggregato per ogni colonna. È possibile avere lo stesso aggregato solo della prima riga e non si ripete di nuovo per ogni riga? – user3758745

Problemi correlati