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);
Analise a query abaixo e assinale a alternativa correta:
WITH ag_with AS (
SELECT * FROM clube.agendamento a
INNER JOIN clube.instalacao i ON i.id = a.id_instalacao
RIGHT JOIN clube.socio s ON s.id = a.id_socio
)
SELECT DISTINCT s2.*
FROM ag_with AS aw, clube.socio AS s2
WHERE
s2.id = aw.id_socio AND
s2.recomendado_por IS NOT NULL