imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 21.10.2005, 14:40     # 1
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Unhappy Пмогите с SQl запросом.

Доброго времени суток.
Есть три таблицы:
-------
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));

Вообще ничего не возвращает...

Как мне исправится ?
Как сделать такой запрос коректно ?

С уважением. Ворон.
Raven B. вне форума  
Старый 21.10.2005, 15:57     # 2
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Немного непонятно при чём тут массив norm_id.
Зачем ограничения WHERE ((t3.Tabl_3_id=3)OR ...
если нужно просто правильную выборку сделать?

Попробуй сделать два простых работающих примера и потом их соединять. Можно попробовать LEFT JOIN.
EvroStandart вне форума  
Старый 21.10.2005, 16:05     # 3
Novoross
Junior Member
 
Регистрация: 29.09.2005
Сообщения: 99

Novoross Путь к славе только начался
Попробу
Novoross вне форума  
Старый 21.10.2005, 16:08     # 4
Avaf
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
 
Старый 21.10.2005, 16:09     # 5
Novoross
Junior Member
 
Регистрация: 29.09.2005
Сообщения: 99

Novoross Путь к славе только начался
Попробуй написать запрос не весь сразу. а частями......т.е. посмотри как работает выборка 1-ой таблицы, и 2-ой, получи нужные записи, потом цепляй третию табличку..... можно повозиться с созданием представлений(View)....
Novoross вне форума  
Старый 21.10.2005, 18:54     # 6
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
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);"
2EvroStandart:
Цитата:
EvroStandart:
Немного непонятно при чём тут массив norm_id.
С помощью масива norm_id я получаю из Tabl_1 нужные мне Tabl_1_id и Tabl_2_id. (WHERE (norm_id="1")OR(norm_id="1")OR(norm_id="1"))
Естественно все WHERE составляются в программе.
Цитата:
EvroStandart:
Зачем ограничения WHERE ((t3.Tabl_3_id=3)OR ...
если нужно просто правильную выборку сделать?
Согласен. вот пытаюсь разобратся как правильно.
Сейчас попробую LEFT JOIN
Raven B. вне форума  
Старый 21.10.2005, 22:22     # 7
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
Попробовал такой запрос с 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));
Синтаксически вроде бы все верно а на практике не работает =(
Raven B. вне форума  
Старый 22.10.2005, 00:14     # 8
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
2Raven B.
с LEFT JOIN'ом конструкция в принципе неверная

а вот вариант Avaf'а вполне работоспособный
по крайней мере выдаёт то, что ты хотел судя по вопросу
_Lynx_ вне форума  
Старый 22.10.2005, 12:43     # 9
EvroStandart
Full Member
 
Аватар для EvroStandart
 
Регистрация: 20.01.2004
Адрес: Таллинн
Пол: Male
Сообщения: 623

EvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собойEvroStandart Имеются все основания чтобы гордиться собой
Не поленился создать базу с тремя таблицами.
Набросал 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

У меня работает.
EvroStandart вне форума  
Старый 23.10.2005, 14:06     # 10
Raven B.
Member
 
Аватар для Raven B.
 
Регистрация: 12.07.2004
Адрес: Очень странное место.
Сообщения: 328

Raven B. Известность не заставит себя ждатьRaven B. Известность не заставит себя ждать
А у меня нет. =(
За то заработал такой запрос
Код:
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 & "'"
Так что проблема решена в любом случае.
Raven B. вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 00:32.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.