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);
Considerando a SQL abaixo, qual o objetivo da tabela virtual chamada auxiliar?
SELECT
socio.primeiro_nome || ' ' || socio.sobrenome,
socio2.primeiro_nome || ' ' || socio2.sobrenome,
socio.data_cadastro
FROM clube.socio
INNER JOIN (
SELECT socio.recomendado_por, MAX(socio.data_cadastro) data_cadastro
FROM clube.socio
WHERE socio.recomendado_por IS NOT NULL
GROUP BY socio.recomendado_por
ORDER BY 1
) auxiliar ON auxiliar.data_cadastro = socio.data_cadastro
INNER JOIN clube.socio socio2 ON socio2.id = socio.recomendado_por