/ / Perché conta (distinto ..) restituisce valori diversi sulla stessa tabella? - mysql, sql

Perché count (distinct ..) restituisce valori diversi sulla stessa tabella? - mysql, sql

select count(distinct a,b,c,d) from mytable;
select count(distinct concat(a,"-",b),concat(c,"-",d)) from mytable;

Poiché "-" non appare mai nei campi a, b, c, d, le 2 query sopra riportate dovrebbero restituire lo stesso risultato. Ho ragione ?

In realtà non è così, la differenza è di 4 righe su ~ 60M e non riesco a capire come sia possibile

Qualche idea o esempio? Grazie

risposte:

1 per risposta № 1

In primo luogo, presumo che tu stia utilizzando MySQL, perché questo è l'unico database dei tuoi tag originali in cui la tua sintassi verrebbe accettata.

In secondo luogo, questo non risponde direttamente alla tua domanda. Dati i tuoi tipi ed espressioni, non vedo come puoi ottenere risultati diversi. Tuttavia, costrutti molto simili possono produrre risultati diversi.

È molto importante notare questo NULL non è il colpevole. Se qualsiasi argomento è NULL Per entrambi COUNT(DISTINCT) o CONCAT(), quindi il risultato è NULL -- e NULLs non vengono contati

Tuttavia, gli spazi alla fine delle stringhe possono essere un problema. Considera i risultati di questa query:

select count(distinct x, y),
count(distinct concat(x, "-", y)),
count(distinct concat(y, "-", x))
from (select 1 as x, "a" as y union all
select 1, "a " union all
select 1, NULL
) a

Mi aspetto che il secondo e il terzo argomento restituiscano la stessa cosa. Ma gli spazi alla fine della stringa causano differenze. COUNT(DISTINCT) li ignora. Però, CONCAT() li incorpori nella stringa. Quindi, i ritorni di cui sopra

1     1     2

E i due valori sono diversi.

In altre parole, due valori potrebbero non essere esattamente uguali, ma COUNT(DISTINCT) potrebbe considerarli uguali. Gli spazi sono un esempio. Le contestazioni sono un altro potenziale colpevole.


0 per risposta № 2

Prendi esempio di dati di esempio

A   B   C   D
1   2   3   4
5   6   7   8
1   2   5   7
1   2   5   7
1   3   3   4
1   3   3   4

quindi conta (distinto (a, b, c, d)) = 4

A   B   C   D
1   2   3   4
5   6   7   8
1   2   5   7
1   3   3   4

e contare (distinto (a, -, b), distinto (c, -, d)) = 3

dist (a,-,b)        dist (c,-,d)
1   2               3   4
5   6               7   8
1   3               5   7