FC ConcursosFC Concursos

Questão FC295894

Qual consulta SQL permite obter os números dos passes que nunca foram usados, juntamente com os números dos passes que já esgotaram o número de viagens realizadas?

Linguagem SQL

CESGRANRIO · 2022

O controle diário da utilização de passes de metrô em uma cidade é feito por programas que utilizam um banco de dados composto pelas seguintes tabelas:

 

CREATE TABLE PASSE (

NUM INTEGER NOT NULL,

DATA_EXP DATE NOT NULL,

NUM_VIAGENS INTEGER NOT NULL,

PRIMARY KEY (NUM))

 

CREATE TABLE REG_VIAGEM (

NUM INTEGER NOT NULL,

NUM_ROLETA INTEGER NOT NULL,

DATA_VIAGEM DATE NOT NULL,

FOREIGN KEY (NUM)

REFERENCES PASSE (NUM))

 

A tabela PASSE contém uma linha para cada passe vendido pela empresa que administra o metrô. A coluna DATA_EXP informa a data de emissão do passe, e a coluna NUM_VIAGENS informa o número de viagens em que o passe poderá ser usado (número máximo de viagens). Este número não sofre alteração ao longo do tempo.

 

A tabela REG_VIAGEM contém uma linha para cada viagem em que o passe foi usado. A coluna NUM_ROLETA informa a roleta na qual o passe foi inserido, e a coluna DATA_VIAGEM informa a data em que o usuário inseriu o passe na roleta.

   

Qual consulta SQL permite obter os números dos passes que nunca foram usados, juntamente com os números dos passes que já esgotaram o número de viagens realizadas?

  1. SELECT A.NUM

    FROM PASSE A

    WHERE A.NUM_VIAGENS = (SELECT COUNT(*) FROM REG_VIAGEM

    WHERE NUM = A.NUM) OR A.NUM NOT IN (SELECT NUM FROM REG_VIAGEM)

  2. SELECT DISTINCT (A.NUM)

    FROM PASSE A

    LEFT JOIN REG_VIAGEM B

    ON A.NUM=B.NUM OR A.NUM NOT IN (SELECT NUM FROM REG_VIAGEM)

  3. SELECT A.NUM

    FROM PASSE A, REG_VIAGEM B

    WHERE A.NUM_VIAGENS = (SELECT COUNT(*) FROM REG_VIAGEM

    WHERE NUM = A.NUM) OR A.NUM != B.NUM

  4. SELECT A.NUM

    FROM PASSE A

    INTERSECT

    SELECT A.NUM

    FROM PASSE A

    WHERE A.NUM NOT IN (SELECT NUM FROM REG_VIAGEM)

  5. SELECT NUM

    FROM PASSE

    EXCEPT

    SELECT NUM

    FROM REG_VIAGEM

Mostrar resposta e comentário

Gabarito

A

Comentário do professor

A consulta retorna os números de passe desejados a partir da tabela PASSE filtrando duas situações por meio da cláusula WHERE.

A primeira condição usa uma subconsulta correlacionada que conta as viagens registradas para o passe atual: \(A.NUM\_VIAGENS = (SELECT COUNT(*) FROM REG\_VIAGEM WHERE NUM = A.NUM)\). Aqui o \(COUNT(*)\) compara o total de usos efetivos com o número máximo de viagens armazenado em NUM_VIAGENS, identificando os passes que já esgotaram todas as viagens.

A segunda condição, NOT IN (A.NUM NOT IN (SELECT NUM FROM REG_VIAGEM)), seleciona os passes que não aparecem em REG_VIAGEM — ou seja, nunca foram usados. Como REG_VIAGEM.NUM é NOT NULL, o uso de NOT IN é seguro.

O operador lógico OR une as duas situações, e como NUM é chave primária em PASSE, cada número aparece apenas uma vez no resultado.

Conteúdo do catálogo FC Concursos · Atualizado em

Continue aprendendo