Запрос Из Таблиц Один Ко Многим

arvitaly

New Member
13.04.2009
4
0
30
Казань
#1
Такая задачка

table 1 (порядка 200к записей)
id name
table2 (соответственно, порядка 1млн записей)
id table1_id field2
Соответственно table1 и table2 соединяются по table1.id и table2.table1_id
Необходимо выбрать записи из первой таблицы по условию

(table2.id = 1 И table2.id = 3)
ИЛИ
(table2.id = 4 И table2.id = 5)
ИЛИ
(table2.id = 7 И table2.id = 9)
....
Помогите оптимизировать запрос :) Пробовал subquery и join с group by
 

arvitaly

New Member
13.04.2009
4
0
30
Казань
#3
Вот например

<!--shcode--><pre><code class='sql'>select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 1 or table2.id = 2 ) ) group by table1.id having count(*) = 2[/CODE]

Это для одного условия И, соответственно чтобы объединить их Union?

<!--shcode--><pre><code class='sql'>select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 1 or table2.id = 2 ) ) group by table1.id having count(*) = 2
union
select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 3 or table2.id = 4 ) ) group by table1.id having count(*) = 2[/CODE]


Пока чот не очень быстро пашет)

Второй вариант еще медленнее, что и логичнее, подзапросы

<!--shcode--><pre><code class='sql'>select * from table1 where

(
select count(*) from table2 where table1.id = table1_id and table2.id = 1)>0
and
select count(*) from table2 where table1.id = table1_id and table2.id = 2)>0
)
or

(
select count(*) from table2 where table1.id = table1_id and table2.id = 3)>0
and
select count(*) from table2 where table1.id = table1_id and table2.id = 4)>0
)[/CODE]
 

-master-

Well-Known Member
14.01.2012
616
20
#4
это все можно записать как table2.id in (1,2,3,4)

Добавлено: что касается оптимизации то тут надо смотреть на планы
 

-master-

Well-Known Member
14.01.2012
616
20
#6
про что вы говорите не совсем понятно.
кто вас знает, зачем вы эти подзапросы пишите, может такая у вас к ним любовь...
 

-master-

Well-Known Member
14.01.2012
616
20
#7
Код:
select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 1 or table2.id = 2 ) ) group by table1.id having count(*) = 2
union
select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 3 or table2.id = 4 ) ) group by table1.id having count(*) = 2
сколько тут возхвращается записей?
Код:
select * from table1 inner join table2 on table2.table1_id = table1.id
where table2.id in (1,2,3,4 ) group by table1.id having count(*) = 2
а тут?
а теперь расскажите что возвращают ваши запросы