2011-10-08 3 views
1

У меня есть две таблицы:Объединение двух таблиц в выбранном

TABLE 1 
ID VALUE 
1 ABC 
2 DEF 
3 GHI 
4 JKL 
5 XYZ 

TABLE 2 
ID T1_ID VALUE 
1 1  A 
2 1  B 
3 2  A 
4 3  A 
5 3  B 
6 4  B 

Я хочу, чтобы выбрать все строки из таблицы 1, которые имеют ряд Таблица 2 для значений А и В. Это было бы строки 1 и 3 (не 2, потому что он имеет только A, а не 4, потому что он имеет только B). Могу ли я сделать это без подзапроса?

(Примечание: Я также должен запросить от значений в таблице 1, так что я не могу просто запросить таблицу 2.)

+0

Почему вы должны сделать это без подзапроса? – GolezTrol

+0

Производительность подзапроса может быть плохим, потому что таблица 2 огромна. –

+0

Без подзапроса вам понадобится соединение, что может быть так же плохо. Лучшая идея - попробовать различные решения и проверить производительность. Также зависит от базы данных. MySQL очень хорош с левыми соединениями и плохо с подзапросами и фильтрами IN, а в Oracle - наоборот. Какую БД вы используете? – GolezTrol

ответ

3

Tadaaah! Без подзапроса.

select distinct 
    t1.* 
from 
    Table1 t1 
    inner join Table2 t2a on t2a.t1_ID = t1.ID and t2a.VALUE = 'A' 
    inner join Table2 t2b on t2b.t1_ID = t1.ID and t2b.VALUE = 'B' 
2
SELECT t1.ID, 
     t1.VALUE 
FROM Table1 t1 
     JOIN Table2 t2 
     ON t1.ID = t2.T1_ID 
WHERE t2.VALUE IN ('A', 'B') 
GROUP BY t1.ID, 
      t1.VALUE 
HAVING COUNT(DISTINCT t2.VALUE) = 2 
+0

Различные решения все вместе. Возможно, OP может протестировать ваше решение против моей производительности. Интересно, что лучше. – GolezTrol

+0

С хорошими индексами я бы подумал, что 'JOIN' будет лучше. Менее легко расширяется до произвольного количества элементов. Помогло бы знать СУРБД тоже ... –

+0

Из-за сложности запроса первый ответ был проще интегрировать. –

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