Pular para o conteúdo principal

Questão de Banco de Dados — PostgreSQL — PROGEP FURG 2017

Banco de DadosPostgreSQL
Código
qg947288
Banca
PROGEP FURG
Órgão
FURG
Ano
2017
Cargo
PROGEP - - Tec ( )

A sequência de queries SQL abaixo cria a estrutura base de um banco de dados PostgreSQL que será utilizada na questão.

 

CREATE SCHEMA clube;

CREATE TABLE clube.socio (

id SERIAL,

primeiro_nome VARCHAR(40) NOT NULL,

sobrenome VARCHAR(200) NOT NULL,

endereco VARCHAR(200) NOT NULL,

telefone VARCHAR(20) NOT NULL,

recomendado_por INTEGER,

data_cadastro TIMESTAMP WITHOUT TIME ZONE NOT NULL,

CONSTRAINT socio_data_cadastro_key UNIQUE(data_cadastro),

CONSTRAINT socio_pkey PRIMARY KEY(id)

) WITH (oids = false);

CREATE TABLE clube.instalacao (

id SERIAL,

nome VARCHAR(200) NOT NULL,

custo_por_socio NUMERIC(10,2),

custo_por_convidado NUMERIC(10,2),

custo_inicial NUMERIC(10,2),

CONSTRAINT instalacao_pkey PRIMARY KEY(id)

) WITH (oids = false);

CREATE TABLE clube.agendamento (

id SERIAL,

id_socio INTEGER NOT NULL,

id_instalacao INTEGER NOT NULL,

inicio TIMESTAMP WITHOUT TIME ZONE NOT NULL,

fim TIMESTAMP WITHOUT TIME ZONE,

CONSTRAINT agendamento_pkey PRIMARY KEY(id),

CONSTRAINT agendamento_fk FOREIGN KEY (id_socio)

REFERENCES clube.socio(id)

ON DELETE RESTRICT ON UPDATE CASCADE

NOT DEFERRABLE,

CONSTRAINT agendamento_fk1 FOREIGN KEY (id_instalacao)

REFERENCES clube.instalacao(id)

ON DELETE RESTRICT ON UPDATE CASCADE

NOT DEFERRABLE

) WITH (oids = false);

 

Qual das queries SQL abaixo busca corretamente todos os campos dos agendamentos futuros, mostrando também o telefone de quem recomendou o sócio que agendou a instalação, quando existente?

  1. ASELECT agendamento.*, socio_pai.telefone FROM clube.agendamento INNER JOIN clube.socio ON socio.id = agendamento.id_socio LEFT JOIN clube.socio AS socio_pai ON socio_pai.id = socio.recomendado_por WHERE NOW() < inicio;
  2. BSELECT * FROM clube.agendamento LEFT JOIN clube.socio ON socio.id = agendamento.id_socio LEFT JOIN clube.socio AS socio_pai ON socio_pai.id = socio.recomendado_por WHERE NOW() BETWEEN inicio AND fim;
  3. CSELECT agendamento.*, socio_pai.telefone FROM clube.agendamento INNER JOIN clube.socio ON socio.id = agendamento.id_socio INNER JOIN clube.socio AS socio_pai ON socio_pai.id = socio.recomendado_por WHERE NOW() > fim;
  4. DSELECT agendamento.*, socio.telefone FROM clube.agendamento INNER JOIN clube.socio ON socio.id = agendamento.id_socio WHERE NOW() > fim;
  5. ESELECT agendamento.*, socio.telefone FROM clube.agendamento LEFT JOIN clube.socio ON socio.id = agendamento.id_socio WHERE NOW() < inicio;
Revelar gabarito e comentário

GabaritoA — SELECT agendamento.*, socio_pai.telefone FROM clube.agendamento INNER JOIN clube.socio ON socio.id = agendamento.id_socio LEFT JOIN clube.socio AS socio_pai ON socio_pai.id = socio.recomendado_por WHERE NOW() < inicio;

Link permanente: /questoes/qg947288