2010-02-19 10 views
9

Dire che ho Tabella1 che ha righe duplicate (dimenticare il fatto che non ha chiave primaria ...) È possibile riscrivere quanto segue senza usare un JOIN, subquery o CTE e anche senza dover compitare le colonne in qualcosa come un GROUP BY?Conteggio di righe distinte senza utilizzare la sottoquery

SELECT COUNT(*) 
FROM (
    SELECT DISTINCT * FROM Table1 
) T1 
+0

Perché non vuoi una subquery? – erikkallen

+0

@erikkallen: più di una ponderatezza, davvero. Mi piace conoscere le mie opzioni :) – squillman

risposta

8

No, non è possibile.

Se si è limitati dal proprio framework/strumento di query/qualsiasi cosa, non è possibile utilizzare una sottoquery e non è possibile specificare il nome di ciascuna colonna in GROUP BY, si è SOL.

Se non si è limitati dal proprio framework/strumento di query/qualsiasi cosa, non c'è motivo non per utilizzare una sottoquery.

3

se davvero vuole veramente fare che si può solo "SELECT COUNT (*) FROM tabella1 GROUP BY tutto, colonne, qui" e prendere le dimensioni del set di risultati come il valore del tuo.

Ma sarebbe dailywtf codice degno;)

+0

Sì, quindi la frase "Non voglio usare un GROUP BY" nella mia domanda;) – squillman

8

Si può fare qualcosa di simile.

SELECT Count(DISTINCT ProductName) FROM Products 

ma se si desidera un conteggio di record completamente distinti, sarà necessario utilizzare una delle altre opzioni citate.

Se volevi fare qualcosa come hai suggerito nella domanda, ciò implicherebbe che tu abbia record duplicati nella tua tabella.

Se non si dispone di record duplicati SELECT DISTINCT * from table sarebbe lo stesso senza il distinto.

+0

Grazie per questo esempio: questo era il mio problema esatto quando sono arrivato a cercare. –

+0

Questa dovrebbe essere la risposta accettata –

1

Volevo solo per affinare la risposta dicendo che è necessario controllare che il tipo di dati delle colonne è paragonabile - altrimenti si otterrà un errore nel tentativo di renderli distinti:

esempio com.microsoft.sqlserver.jdbc.SQLServerException: il tipo di dati ntext non può essere selezionato come DISTINCT perché non è confrontabile.

Questo è vero per le grandi colonne binarie, xml e altre a seconda del tuo RDBMS - rtm. La soluzione per SQLServer, ad esempio, è il cast da un ntext a un nvarchar (MAX) da SQLServer 2005 in poi.

Se rispettate le colonne PK allora si dovrebbe essere OK (non ho verificato io stesso, ma avrei pensato logicamente che le colonne PK dovrebbero essere comparabili)

Problemi correlati