2016-10-27 3 views
1

Предположим, что у нас есть таблица 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 в таблице А.

Итак, что это хороший способ сделать это?

+1

Зависит от используемых dbms. Некоторые продукты оптимизируют подзапросы лучше других. – jarlh

+0

Я не понимаю, что вы подразумеваете под повторением. Если вы хотите вернуть всех студентов в класс с фамилией, начинающейся с «S», вы не хотите, чтобы имя класса повторялось? –

+0

'GROUP BY' не предназначен для устранения дубликатов, вместо этого используйте SELECT DISTINCT. Более поздние версии MySQL не допускают недопустимую группу (если не в режиме совместимости.) – jarlh

ответ

2

Используйте присоединиться и отчетливый

selct distinct A.* 
from A 
inner join B 
    on B.ID = A.ID 
where B.ColumnB = 'Filter' 
1

Там нет никаких проблем с GROUP BY в других системах баз данных! Они просто заставляют вас писать целые столбцы в разделе GROUP BYили с совокупными функциями , как и должно быть, в отличие от MySQL, который допускает эту глупую вещь. Таким образом:

SELECT a.Col1,a.Col2,a.Col3... 
FROM A 
JOIN B 
ON(a.id = b.id) 
WHERE B.some_column = 'my-filter' 
GROUP BY a.Col1,a.Col2,a.Col3... 
+0

Это имеет смысл. Единственная проблема, с которой я мог столкнуться, это то, что я модифицирую слой приложения Java, который управляет доступом к базе данных, и было бы сложно угадать все имена столбцов таблицы, которые я запрашиваю в каждый момент. Хотя я думаю, что это можно было бы отразить, поскольку имена столбцов являются методами классов сущностей, которые преобразуются в таблицы инструментом ORM. – user3289695

Смежные вопросы