Tengo el siguiente esquema:
create table Took( sID integer, oID integer, grade integer); INSERT INTO Took VALUES (1, 1, 90), (1, 2, 100), (2, 1, 90), (2, 3, 80), (2, 4, 85) ;Tengo la siguiente consulta también:
(select sid from took) except all (select sid from took where grade < 90); y esto produce la salida 1,1,2 que se espera ya que los valores de calificación son >= 90 en este caso. Sin embargo, cuando elimino la cláusula all para
select sid from took) except (select sid from took where grade < 90); La salida es solo 1 . Sé que all determina si existen duplicados, por lo que en este caso espero que el resultado sea 1,2 y no solo 1 . Entonces, ¿qué está pasando?
De la documentación de PSQL, cuando EXCEPT se usa solo:
El operador EXCEPT calcula el conjunto de filas que están en el resultado de la instrucción SELECT de la izquierda pero no en el resultado de la de la derecha.
Pero, cuando ALL se usa junto con EXCEPT:
El resultado de EXCEPTO no contiene ninguna fila duplicada a menos que se especifique la opción TODO. Con TODO, una fila que tiene m duplicados en la tabla de la izquierda y n duplicados en la tabla de la derecha aparecerá un máximo de (mn,0) veces en el conjunto de resultados.
En su ejemplo, el resultado de la consulta SELECT izquierda será el sid de todas las filas.
test=# select sid from took; sid ----- 1 1 2 2 2 (5 rows)Y, el resultado de la consulta SELECCIONAR a la derecha serán las dos últimas filas con una calificación <90.
test=# select sid from took where grade < 90; sid ----- 2 2 (2 rows)Ahora, ejecutando la consulta con solo EXCEPTO:
test=# (select sid from took) except (select sid from took where grade < 90); sid ----- 1 (1 row)Lo que pasó aquí es,
Esta es la explicación del resultado que obtuviste.
Ahora, ejecutando la consulta con EXCEPTO TODO:
test=# (select sid from took) except all (select sid from took where grade < 90); sid ----- 1 1 2 (3 rows)En este caso, simplemente eliminamos el resultado de la consulta SELECCIONAR a la derecha del resultado de la consulta SELECCIONAR a la izquierda.
Espero que esto ayude.