Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > SQL-запрос (выборка из 3-х таблиц)


Автор: stron 17.4.2005, 09:47
Чего-то никак не могу придумать запрос
3 таблицы:


Table1:
table1_id
table1_data

Table2:
table2_id
table1_id
table3_id

Table3:
table3_id
table3_data


Короче, связываем данные из 2-х таблиц(Table1 и Table3) через третью
Много ко многим.


Вопрос:
как выбрать table1_data у которых есть несколько table3_data
(проще говоря поиск по нескольким значениям)



Автор: Kurt 17.4.2005, 13:01
Немножко не понял, что ты хочешь.
Вот, например, запрос, к-й вернет список table1_data и соотв. table3_data.

Код
select table1.table1_data, 
table3.table3_data from table1, table2, table3
where table1.table1_id=table2.table1_id and table3.table3_id=table2.table3_id


Ну, а если тебе нужны только table1_data, для которых существуют данные из table3, то так:

Код
select table1.table1_data from table1, table2, table3
where table1.table1_id=table2.table1_id and table3.table3_id=table2.table3_id


А вообще, поясни задачу.

Автор: stron 17.4.2005, 15:07
Пример:

Table1:
1 Вася Пупкин
2 Крендель
3 Хрюндель


Table2:
1 1(Вася Пупкин) 1(Хороший)
2 1(Вася Пупкин) 3(Гнус)
3 2(Крендель) 1(Хороший)
4 2(Крендель) 2(Умный)
5 2(Крендель) 4(Ворчун)
6 3(Хрюндель) 4(Ворчун)
7 3(Хрюндель) 2(Умный)



Table3:
1 Хороший
2 Умный
3 Гнус
4 Ворчун


Так вот, надо выбрать умных ворчунов

Автор: Kesh 17.4.2005, 15:15
Код
select * from table1 t1, table2 t2, table3 t3
where ( t1.table1_id = t2.table1_id )
and ( t3.table3_id = t2.table3_id )
and ( t3.table3_data in ('Умный', 'Ворчун') )


По-моему что-то вроде этого...
Добавлено @ 15:16
Нет... не так... сейчас еще подумаю...

Автор: Kesh 17.4.2005, 15:29
Код

select * from table1 t1
left join table2.table2_id as t21
on (table1.table1_id = table2.table1_id)
and (table3.table3_id = table2.table3_id)
and (table3.table3_data like 'Умный')
left join table2.table2_id as t22 
on (table1.table1_id = table2.table1_id)
and (table3.table3_id = table2.table3_id)
and (table3.table3_data like 'Ворчун')
where not (t21 is null) and not (t22 is null)

Запрос скореее всего неправильный... так как писал из головы и не проверял... но идея такова... Делать Join по параметру... и проверять есть ли он (если его нет - то null)

Автор: stron 17.4.2005, 18:39
Всё оказалось проще:
Код

select  table1_id, table1_data   from  table1
left join  table2
on ( table1.id = table2.table1_id )

left join  table3  as  table30
on ( table30.id = table2.table3_id )  and  ( table30.table3_data = 'Умный' )

left join  table3  as  table31
on ( table31.id = table2.table3_id )  and  ( table31.table3_data = 'Ворчун' )

where ( table31.table3_data  is not NULL )

Всем спасибо!!

Автор: Kesh 17.4.2005, 19:30
stron ИМХО надо еще
Код

table30.table3_data 
проверять

Автор: stron 17.4.2005, 21:01
нет, там всё хорошо
дополнительная проверка круто искаверкает рез-ты

Автор: Kesh 17.4.2005, 23:25
stron Ах, ну да точно... smile Согласен...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)