Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

272
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda