How to return driver names in SQL table?

Asked

Viewed 134 times

1

I have the following tables below, and I would like to return only the name of the pilots who 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?

  • 1

    Unfortunately in its structure there is no connection between the team and the race or circuit in which there was participation, making it impossible to obtain the information you want

  • @Sorack updated the question, I forgot for some information I misjudged irrelevant.

  • 1

    Table structure is missing equipe and resultado.

1 answer

1


You can use the clause NOT EXISTS to verify the occurrences for that pilot in tests 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 whether 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".

In free translation:

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

The use of NOT in front of the EXISTS will invert its function by returning the lines that have no value to the subquery informed.

  • In this case you will know which drivers have never won a race in Brazil, but I believe this is what the owner of the question wants.

  • @Fabianolothor negative. Table information resultado not only contains the winning drivers, as can be evidenced by the column posicao. So the result of this query will bring only those who never participated and not those who never won

  • True @Sorack, I had "read" the result column as if it were just a table with the winners.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.