| imho.ws |
![]() |
|
|
|
# 1 |
|
Member
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328
![]() ![]() |
Доброго времени суток.
Есть три таблицы: ------- Tabl_1 ------- norm_id Tabl_2_id Tabl_1_id ------- Tabl_2 ------- Tabl_3_id std_id Tabl_2_id ------- Tabl_3 ------- control Tabl_3_id Есть масив norm_id. 1. Я получаю из Tabl_1 все Tabl_2_id и Tabl_1_id где norm_id равно значениям масива. Tabl_1_id понядобятся в конце. Тут все ок. 2. Я получаю из Tabl_2 все Tabl_3_id где Tabl_2_id равны тем которые получены из прошлой таблицы. 3. Я должен составить запрос, который выдаст в первом столбце все Tabl_1_id выбраные на шаге 1, а во втором все control из Tabl_3, где Tabl_3 равно Tabl_3_id полученые на шаге 2. Количество значений колонок будут соответствовать 1:1. Для этого попробовал написать такой запрос: sql_q = "SELECT Tabl_1_id,control FROM Tabl_1,Tabl_3 WHERE ((Tabl_1_id=55)OR(Tabl_1_id=56)) and ((Tabl_3_id=1)OR(Tabl_3_id=3));" Но я явно что то недомудрил. Вместо 2х строк я получаю 4. Для каждого Tabl_1_id я получаю все controlы соответствующие каждому из control_id. Еще пробывал такой запрос: SELECT t1.Tabl_1_id,t3.control FROM Tabl_1 t1 INNER JOIN Tabl_2 t2 ON t1.Tabl_2_id=t2.Tabl_2_id INNER JOIN Tabl_3 t3 ON t3.Tabl_3_id=t2.Tabl_3_id WHERE ((t3.Tabl_3_id=3)OR(t3.Tabl_3_id=1)) and ((t1.Tabl_1_id=1)OR(t1.Tabl_1_id=2)); Вообще ничего не возвращает... Как мне исправится ? Как сделать такой запрос коректно ? С уважением. Ворон. |
|
|
|
|
# 2 |
|
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Немного непонятно при чём тут массив norm_id.
Зачем ограничения WHERE ((t3.Tabl_3_id=3)OR ... если нужно просто правильную выборку сделать? Попробуй сделать два простых работающих примера и потом их соединять. Можно попробовать LEFT JOIN. |
|
|
|
|
# 4 |
|
Guest
Сообщения: n/a
|
Может так
Может проще сразу увязать все таблицы и отобрать по norm_id?
Что-то типа этого... select t3.control,t1.tabl_1_id from table1 t1, table2 t2, table3 t3 where t1.tabl_2_id=t2.tabl_2_id and t2.tabl_3_id=t3.tabl_3_id and t1.norm_id in (1,2) ,где (1,2) - массив norm_id |
|
|
# 6 | ||
|
Member
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328
![]() ![]() |
2Avaf:
Сейчас попробую. 2Novoross: Отдельно запросы работают. Код:
sql_q = "SELECT control FROM Tabl_3 WHERE (Tabl_3_id=1)OR(Tabl_3_id=3);" sql_q = "SELECT Tabl_1_id FROM Tabl_1 WHERE (Tabl_1_id=55)OR(Tabl_1_id=56);" Цитата:
Естественно все WHERE составляются в программе. Цитата:
Сейчас попробую LEFT JOIN |
||
|
|
|
|
# 7 |
|
Member
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328
![]() ![]() |
Попробовал такой запрос с LEFT JOIN
Код:
SELECT control FROM Tabl_3 WHERE ((Tabl_3_id=3)OR(Tabl_3_id=1)) LEFT JOIN Tabl_1_id FROM Tabl_1 WHERE ((Tabl_1_id=1)OR(Tabl_1_id=2)); |
|
|
|
|
# 9 |
|
Full Member
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Не поленился создать базу с тремя таблицами.
Набросал SQL: SELECT Tabl_3.control, Tabl_1.Tabl_1_id FROM Tabl_3 LEFT JOIN Tabl_2 ON Tabl_2.Tabl_3_id=Tabl_3.Tabl_3_id LEFT JOIN Tabl_1 ON Tabl_1.Tabl_2_id=Tabl_2.Tabl_2_id WHERE Tabl_1.norm_id=1 У меня работает.
|
|
|
|
|
# 10 |
|
Member
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328
![]() ![]() |
А у меня нет. =(
За то заработал такой запрос Код:
sql_q = "SELECT ph_f_control_comp_t.ph_f_control_comp_id,control_t.control" sql_q = sql_q & " FROM ph_f_control_comp_t, control_comp_t, control_t" sql_q = sql_q & " WHERE Str(control_comp_t.control_id) = Str(control_t.control_id)" sql_q = sql_q & " AND str(ph_f_control_comp_t.control_comp_id)=str(control_comp_t.control_comp_id)" sql_q = sql_q & " AND ph_f_control_comp_t.norm_id = '" & veg & "'" |
|
|