Mysql альтернативный выбор - PullRequest
0 голосов
/ 29 мая 2009

У меня есть запрос, который, как я знаю, может быть выполнен с использованием подвыбора, но из-за больших размеров таблицы (100k + строк на таблицу) я хотел бы найти альтернативу с использованием объединения. Это не домашнее задание, но в таких терминах проще поделиться примером.

Предположим, есть две таблицы:
Студенты
: id: имя
1 Том
2 Салли
3 бен

Книги
: id: student_id: book
1 1 Математика 101
2 1 История
3 2 NULL
4 3 Математика 101

Я хочу найти всех студентов, у которых нет учебника истории. Рабочий отбор:
выберите имя из студентов, у которых нет идентификатора (выберите student_id из книг, где book = 'History');

Это возвращает Салли и Бена.

Спасибо за ваши ответы!

1 Ответ

1 голос
/ 29 мая 2009

Производительность - это проблема? Или это всего лишь теоретический вопрос (домашнее задание?), Чтобы избежать подзапроса? Если это производительность, то это:

SELECT *
FROM studnets s
WHERE NOT EXISTS
(SELECT id FROM books WHERE student_id = s.id AND book = 'History')

будет работать намного лучше, чем IN, который вы делаете на MySQL (на некоторых других базах данных они будут работать аналогично) Это также можно перефразировать как объединение:

SELECT s.*
FROM studnets s
LEFT JOIN books b ON s.id = b.student_id AND b.book = 'History'
WHERE b.id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...