Come si crea un'istruzione SQL che restituisce risultati modificati da una sottoquery o un join o qualcos'altro che si occupa delle informazioni che si sta tentando di restituire?SQL: alternativa "NOT IN" per selezionare le righe in base ai valori di * diverse * righe?
Ad esempio:
CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);
Qualcuno potrebbe essere erroneamente in più di una squadra:
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');
Quindi homer
non può decidere per la sua squadra, quindi è su entrambi. Do'h!
Voglio conoscere tutti quelli che sono attivi, the homer team
che non è anche nella squadra pin pals
. Il meglio che posso fare è questo:
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');
Con conseguente:
+-----------------------+----------------+
| 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)
Che, si sa, brillante!
Le prestazioni ne risentono, come la subquery sta per essere eseguito per ciascun risultato della query, che è B alla A alla D. Grande per un paio di righe, piuttosto male per le centinaia di migliaia di filari.
Che cos'è un modo migliore? Per lo più penso che unirsi con se stessi farebbe il trucco, ma non riesco a spiegarmi come farlo.
Ci sono altri modi per fare questo, senza l'utilizzo, NOT IN(SELECT ...)
Inoltre, qual è il nome per questo tipo di problema?
left outer si uniscono a te stesso è ciò che desideri. –