Para um SGBD PostgreSQL, crie um único script SQL para:
Importar os dados do arquivo de entrada para uma tabela física do BD;
Copiar os dados da tabela de entrada para outra tabela auxiliar, que será a sua tabela de referência; Daqui para frente não utilize mais os dados da tabela de entrada;
Transformar os dados para os tipos de dados mais adequados (SE necessário);
Separar corretamente os dados em pelo menos 6 tabelas auxiliares, com as devidas chaves primãrias e chaves estrangeiras;
Excluir todos os campos não mais necessários e/ou que possam ser calculados;
Fornecer um comando para consulta aos dados das tabelas resultantes, que tenha junção de pelo menos quatro tabelas;
Fornecer um resumo com a quantidade de registros em cada tabela, ao final do processo;
Observação: todos os objetos devem ser criados/recriados dentro do script, dentre eles:
tabelas;
chaves primárias;
chaves estrangeiras;
alteração de tipos;
exclusão de todos os campos desnecessários e/ou calculados;
Os scripts devem executar corretamente E sem qualquer interrupção!

Passo 1

Beleza, vamos resolver esse exercício juntos! A questão pede para criar um script SQL para PostgreSQL que realiza várias operações de manipulação de dados, como importar, copiar, transformar e organizar dados em várias tabelas com chaves primárias e estrangeiras. Para isso, vamos precisar usar comandos SQL como CREATE TABLE, COPY, INSERT INTO, ALTER TABLE, DROP COLUMN, entre outros. Vamos por partes!

Passo 2

Primeiro, precisamos importar os dados do arquivo de entrada para uma tabela física no banco de dados. Vamos supor que o arquivo seja um CSV chamado dados_entrada.csv e que a tabela inicial se chame tabela_entrada. Usaremos o comando CREATE TABLE para criar a tabela e COPY para importar os dados.
CREATE TABLE tabela_entrada (
    coluna1 tipo1,
    coluna2 tipo2,
    -- continue com as colunas conforme o arquivo
);

COPY tabela_entrada FROM '/caminho/para/dados_entrada.csv' DELIMITER ',' CSV HEADER;

Passo 3

Agora, vamos copiar os dados da tabela_entrada para outra tabela auxiliar que servirá como tabela de referência. Essa nova tabela vai se chamar tabela_referencia.
CREATE TABLE tabela_referencia AS TABLE tabela_entrada;
A partir de agora, vamos trabalhar apenas com a tabela_referencia.

Passo 4

É hora de transformar os dados para os tipos mais adequados. Vamos supor que a coluna coluna1 deveria ser um inteiro e a coluna2 uma data. Usamos ALTER TABLE para modificar os tipos.
ALTER TABLE tabela_referencia
    ALTER COLUMN coluna1 TYPE INTEGER USING coluna1::INTEGER,
    ALTER COLUMN coluna2 TYPE DATE USING coluna2::DATE;

Passo 5

Agora, vamos separar os dados em pelo menos 6 tabelas auxiliares. Vou criar exemplos de tabelas como clientes, produtos, pedidos, itens_pedido, fornecedores e categorias. Também vamos definir chaves primárias e estrangeiras.
-- Tabela de Clientes
CREATE TABLE clientes (
    cliente_id SERIAL PRIMARY KEY,
    nome VARCHAR(100),
    email VARCHAR(100)
);

-- Tabela de Produtos
CREATE TABLE produtos (
    produto_id SERIAL PRIMARY KEY,
    nome VARCHAR(100),
    categoria_id INTEGER,
    FOREIGN KEY (categoria_id) REFERENCES categorias(categoria_id)
);

-- Tabela de Categorias
CREATE TABLE categorias (
    categoria_id SERIAL PRIMARY KEY,
    descricao VARCHAR(100)
);

-- Tabela de Pedidos
CREATE TABLE pedidos (
    pedido_id SERIAL PRIMARY KEY,
    cliente_id INTEGER,
    data_pedido DATE,
    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id)
);

-- Tabela de Itens do Pedido
CREATE TABLE itens_pedido (
    item_id SERIAL PRIMARY KEY,
    pedido_id INTEGER,
    produto_id INTEGER,
    quantidade INTEGER,
    FOREIGN KEY (pedido_id) REFERENCES pedidos(pedido_id),
    FOREIGN KEY (produto_id) REFERENCES produtos(produto_id)
);

-- Tabela de Fornecedores
CREATE TABLE fornecedores (
    fornecedor_id SERIAL PRIMARY KEY,
    nome VARCHAR(100),
    contato VARCHAR(100)
);

Passo 6

Vamos inserir os dados da tabela_referencia nas tabelas auxiliares correspondentes. Isso envolve fazer INSERT INTO para cada tabela, mapeando as colunas corretamente.
-- Inserir Clientes
INSERT INTO clientes (nome, email)
SELECT DISTINCT nome_cliente, email_cliente FROM tabela_referencia;

-- Inserir Categorias
INSERT INTO categorias (descricao)
SELECT DISTINCT categoria FROM tabela_referencia;

-- Inserir Produtos
INSERT INTO produtos (nome, categoria_id)
SELECT DISTINCT nome_produto, c.categoria_id
FROM tabela_referencia tr
JOIN categorias c ON tr.categoria = c.descricao;

-- Inserir Fornecedores
INSERT INTO fornecedores (nome, contato)
SELECT DISTINCT fornecedor, contato_fornecedor FROM tabela_referencia;

-- Inserir Pedidos
INSERT INTO pedidos (cliente_id, data_pedido)
SELECT c.cliente_id, tr.data_pedido
FROM tabela_referencia tr
JOIN clientes c ON tr.nome_cliente = c.nome;

-- Inserir Itens do Pedido
INSERT INTO itens_pedido (pedido_id, produto_id, quantidade)
SELECT p.pedido_id, pr.produto_id, tr.quantidade
FROM tabela_referencia tr
JOIN pedidos p ON tr.pedido = p.pedido_id
JOIN produtos pr ON tr.produto = pr.produto_id;

Passo 7

Agora, vamos excluir os campos que não são mais necessários ou que podem ser calculados. Por exemplo, se todas as informações agora estão divididas nas tabelas auxiliares, podemos remover os dados duplicados na tabela_referencia.
ALTER TABLE tabela_referencia
    DROP COLUMN nome_cliente,
    DROP COLUMN email_cliente,
    DROP COLUMN categoria,
    DROP COLUMN nome_produto,
    DROP COLUMN fornecedor,
    DROP COLUMN contato_fornecedor,
    DROP COLUMN pedido;

Passo 8

Vamos fornecer um comando de consulta que faça a junção de pelo menos quatro tabelas. Por exemplo, podemos buscar informações sobre pedidos, clientess, produtos e categorias.
SELECT 
    p.pedido_id,
    c.nome AS cliente,
    pr.nome AS produto,
    ca.descricao AS categoria,
    ip.quantidade,
    p.data_pedido
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.cliente_id
JOIN itens_pedido ip ON p.pedido_id = ip.pedido_id
JOIN produtos pr ON ip.produto_id = pr.produto_id
JOIN categorias ca ON pr.categoria_id = ca.categoria_id;

Passo 9

Por fim, vamos fornecer um resumo com a quantidade de registros em cada tabela resultante.
SELECT 'Clientes' AS tabela, COUNT(*) AS total FROM clientes
UNION ALL
SELECT 'Produtos', COUNT(*) FROM produtos
UNION ALL
SELECT 'Categorias', COUNT(*) FROM categorias
UNION ALL
SELECT 'Fornecedores', COUNT(*) FROM fornecedores
UNION ALL
SELECT 'Pedidos', COUNT(*) FROM pedidos
UNION ALL
SELECT 'Itens_pedido', COUNT(*) FROM itens_pedido;

Resposta

Prontinho! Com esses passos, você consegue criar um script SQL completo para importar, transformar e organizar seus dados no PostgreSQL, além de realizar consultas e obter um resumo das tabelas criadas.

Exercícios relacionados