Как вы делаете инструкцию SQL, которая возвращает результаты, измененные подзапросом, или соединение - или что-то еще, которое касается информации, которую вы пытаетесь вернуть?SQL: «NOT IN» альтернатива для выбора строк на основе значений * разных * строк?
Например:
CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);
Кто-то может неправильно быть более чем одной команды:
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');
Так homer
не может принять решение о своей команде, так что он на обоих. Do'h!
Я хочу знать всех, кто включен, the homer team
, который также не входит в команду pin pals
. Лучшее, что я могу сделать это:
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)
Что, вы знаете, гениально!
Производительность будет страдать, как подзапрос будет выполняться для каждого результата запроса, который является B к A до D. Великого в течение нескольких строк, довольно плохо для сот тысяч строк.
Что лучше? Я в основном думаю, что самообслуживание будет делать трюк, но я не могу окунуться в голову, как это сделать.
Есть ли другие способы сделать это, не используя, NOT IN(SELECT ...)
Кроме того, что это имя для такого рода проблемы?
левый внешний присоединиться к себе, что вы хотите. –