Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

271
Vistas
PSQL excepto vs excepto todos

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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,

  1. Tomamos el resultado de la consulta SELECT izquierda (5 filas).
  2. Luego, elimine todas las filas coincidentes que contengan el resultado de la consulta SELECCIONAR a la derecha (es decir, sid = 2), nos quedan 2 filas con sid = 1.
  3. Ahora, dado que no habrá duplicados, el resultado final será 1 fila con sid = 1.

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda