¿Cómo se hace una declaración de SQL que arroja resultados modificados por una subconsulta, o una combinación, o alguna otra cosa, que trata de la información que intentas devolver?SQL: alternativa "NO EN" para seleccionar filas basadas en valores de * filas * diferentes?
Por ejemplo:
CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);
Alguien podría ser incorrecta en más de un equipo:
INSERT INTO `bowlers` (`name`, `team`) VALUES
('homer', 'pin pals'),
('moe', 'pin pals'),
('carl', 'pin pals'),
('lenny', 'pin pals'),
('homer', 'The homer team'),
('bart', 'The homer team'),
('maggie', 'The homer team'),
('lisa', 'The homer team'),
('marge', 'The homer team'),
('that weird french guy', 'The homer team');
Así homer
no puede decidir sobre su equipo, por lo que hay en ambos. Do'h!
Quiero saber a todos los que están en, the homer team
que no está también en el equipo pin pals
. Lo mejor que puedo hacer es esto:
SELECT a.name, a.team
FROM bowlers a where a.team = 'The homer team'
AND a.name
NOT IN (SELECT b.name FROM bowlers b WHERE b.team = 'pin pals');
El resultado es:
+-----------------------+----------------+
| name | team |
+-----------------------+----------------+
| bart | The homer team |
| maggie | The homer team |
| lisa | The homer team |
| marge | The homer team |
| that weird french guy | The homer team |
+-----------------------+----------------+
5 rows in set (0.00 sec)
Lo que, ya sabes, brillante!
El rendimiento se verá afectada, ya que la subconsulta se va a ejecutar para cada resultado de la consulta, que es B a la A a la D. Grande para un par de filas, Bastante malo para los cientos de miles de filas
¿Cuál es la mejor manera? En su mayoría, estoy pensando que unirse me haría el truco, pero no puedo entender cómo hacerlo.
¿Hay otras maneras de hacer esto, sin usar, NOT IN(SELECT ...)
Además, ¿cuál es el nombre para este tipo de problema?
left outer join volver a usted es lo que quiere. –