Предположим, что у нас есть таблица A, которую мы хотим запросить, и которая связана с другой таблицей B через отношение от одного до многих, поэтому A может иметь несколько объектов B, и каждый объект B может иметь только один объект A , Проблема в том, что при запросе A мне нужно отфильтровать столбец в таблице B. Каков наилучший подход для этого?SQL: как фильтровать по столбцам, которые находятся в разных таблицах?
Если я использую JOIN, то в итоге я получаю повторяющиеся строки A в результате. Это логично, поскольку объект A может иметь много объектов B. В MySQL я могу избежать дубликатов с помощью GROUP BY, но это невозможно в других системах баз данных, они заставляют вас использовать агрегированные функции.
Если я использую подзапросы, то я не думаю, что производительность хорошо, потому что большинство вложенных подзапросы могут возвращать очень большое количество строк:
SELECT * FROM A WHERE ID IN (SELECT A_ID FROM B WHERE B.some_column = 'my-filter');
Этого подзапрос выглядит плохо, если B был огромное количество строк может быть болезненным с точки зрения времени/производительности.
* A_ID является внешним ключом на этом примере, который указывает на поле ID в таблице А.
Итак, что это хороший способ сделать это?
Зависит от используемых dbms. Некоторые продукты оптимизируют подзапросы лучше других. – jarlh
Я не понимаю, что вы подразумеваете под повторением. Если вы хотите вернуть всех студентов в класс с фамилией, начинающейся с «S», вы не хотите, чтобы имя класса повторялось? –
'GROUP BY' не предназначен для устранения дубликатов, вместо этого используйте SELECT DISTINCT. Более поздние версии MySQL не допускают недопустимую группу (если не в режиме совместимости.) – jarlh