SQL: "NOT IN" alternative pour sélectionner des lignes basées sur des valeurs de * différentes * lignes?

Comment faire une requête SQL qui retourne des résultats modifiés par une sous-requête, ou une jointure - ou quelque chose d'autre, qui traite de l'information que vous essayez de revenir?

Par exemple:

CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);

Quelqu'un pourrait, à tort, sur plus d'une équipe:

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');

Donc homer ne peut pas décider de son équipe, donc il est sur les deux à la fois. N'h!

Je veux savoir tout ce qui est sur, the homer team qui n'est pas également sur la pin pals de l'équipe. Le mieux que je puisse faire est ceci:

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');

:

+-----------------------+----------------+
| 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)

Qui, vous le savez, génial!

Les performances s'en ressentiront, comme la sous-requête doit être exécuté pour chaque résultat de la requête, qui est à la Une de la D. Idéal pour quelques lignes, Assez mauvais pour les centaines de milliers de lignes.

Ce qui est une meilleure façon? Je suis la plupart du temps la pensée d'une auto-jointure ferait l'affaire, mais je ne peut pas envelopper la tête autour de la façon de le faire.

Existe-il d'autres façons de le faire, sans l'aide d', NOT IN( SELECT ... )

Aussi, quel est le nom de ce type de problème?

source d'informationauteur