How to return pilot names in SQL table?

1

I have the following tables below, and would like to return only the name of the riders who have never participated in a race in a Brazilian circuit in the country brasil .

Table Structure:

PAIS (id, sigla, nome)

EQUIPE (id, nome, pais_id)
pais_id referencia PAIS

PILOTO(id, nome, equipe_id, pais_id, dt_nascimento)
pais_id referencia PAIS
equipe_id referencia EQUIPE

CIRCUITO (id, nome, pais_id)
pais_id referencia PAIS

PROVA (id, data, duracao, circuito_id, numero_voltas)
circuito_id referencia CIRCUITO

RESULTADO (prova_id, piloto_id, posicao)
prova_id referencia PROVA
piloto_id referencia PILOTO

SQL Values:

insert into pais (id,sigla, nome) values (1,'gbr', 'inglaterra');
insert into pais (id,sigla, nome) values (2,'bra', 'brasil');
insert into pais (id,sigla, nome) values (3,'ale', 'alemanha');
insert into pais (id,sigla, nome) values (4,'ita', 'itália');
insert into pais (id,sigla, nome) values (5,'esp', 'espanha');
insert into pais (id,sigla, nome) values (6,'sui', 'suica');
insert into pais (id,sigla, nome) values (7,'aus', 'austrália');
insert into pais (id,sigla, nome) values (8,'sue', 'suécia');
insert into pais (id,sigla, nome) values (9,'mex', 'méxico');

insert into equipe (id, pais_id, nome) values (1, 1, 'ferrari');
insert into equipe (id, pais_id, nome) values (2, 2, 'mercedes');
insert into equipe (id, pais_id, nome) values (3, 3, 'sauber');
insert into equipe (id, pais_id, nome) values (4, 4, 'williams');
insert into equipe (id, pais_id, nome) values (5, 5, 'red bull');
insert into equipe (id, pais_id, nome) values (6, 6, 'maclaren');
insert into equipe (id, pais_id, nome) values (7, 7, 'force india');
insert into equipe (id, pais_id, nome) values (8, 8, 'toro rosso');
insert into equipe (id, pais_id, nome) values (9, 9, 'haas');

insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (5, 1,  1, 'sebastian vettel', current_date - 1024);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (44, 2, 3, 'lewis hamilton', current_date - 6000);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (19, 4, 2, 'felipe massa', current_date - 5030);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (12, 3, 2, 'felipe nasr', current_date - 2048);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (14, 6, 5, 'fernando alonso', current_date - 1236);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (6, 2,  6, 'nico rosberg', current_date - 5100);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (3, 5,  7, 'daniel ricardo', current_date - 6000);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (27, 5, 8, 'nico hulkenberg', current_date - 7000);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (9, 3,  9, 'marcus ericsson', current_date - 8000);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (55, 8, 1, 'carlos sainz jr.', current_date - 6000);
insert into piloto (id, equipe_id, pais_id, nome, dt_nascimento) values (11, 7, 2, 'sergio perez', current_date - 4056);

insert into circuito(id, pais_id, nome) values (1, 5, 'melbourne');
insert into circuito(id, pais_id, nome) values (2, 3, 'interlagos');

insert into prova (id,data, circuito_id, duracao, numero_voltas) values (1,to_date('15-03-2015','dd-mm-yyyy'), 1, '01:30:12'::interval,50);

insert into resultado (prova_id, piloto_id, posicao) values (1, 44, 1);
insert into resultado (prova_id, piloto_id, posicao) values (1, 6, 2);
insert into resultado (prova_id, piloto_id, posicao) values (1, 5, 3);
insert into resultado (prova_id, piloto_id, posicao) values (1, 19, 4);
insert into resultado (prova_id, piloto_id, posicao) values (1, 12, 5);
insert into resultado (prova_id, piloto_id, posicao) values (1, 3, 6);
insert into resultado (prova_id, piloto_id, posicao) values (1, 27, 7);
insert into resultado (prova_id, piloto_id, posicao) values (1, 9, 8);
insert into resultado (prova_id, piloto_id, posicao) values (1, 55, 9);
insert into resultado (prova_id, piloto_id, posicao) values (1, 11, 10);

What would be the SQL command to perform this query?

    
asked by anonymous 14.07.2017 / 16:22

1 answer

1

You can use the NOT EXISTS clause to check occurrences for that test rider in Brazil:

SELECT p.nome
  FROM piloto p
 WHERE NOT EXISTS(SELECT 1
                    FROM resultado r
                         INNER JOIN prova p ON p.id = r.prova_id
                         INNER JOIN circuito c ON c.id = p.circuito_id
                         INNER JOIN pais pa ON pa.id = c.pais_id
                   WHERE r.piloto_id = p.id
                     AND pa.nome = 'brasil')
  

EXISTS

     

... The subquery is evaluated to determine if it returns any rows. If it returns at least one row, the result of EXISTS is "true"; if the subquery returns no rows, the result of EXISTS is false.

Free translation:

  

... The subquery is evaluated to determine if a line will return. If you return at least one line, the result of EXISTS is "true"; if the subquery does not return any rows, the result of EXISTS is "false."

Using NOT in front of EXISTS will invert its function, returning rows that do not have value to subquery informed.

    
14.07.2017 / 16:36