![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Упростить запрос [D7, MySQL]
parovoZZ © (2006-09-04 13:41:00)Есть запрос
'SELECT Equipment_name as name FROM Equipments WHERE ' +
'((SELECT System_ID FROM Systems WHERE System_name=:prmSys)=System) and ' +
'((SELECT Object_ID FROM Objects WHERE Object_name=:prmObj)=Object_) GROUP BY Equipment_name'
Есть три таблицы
Systems с полями System_ID и System_name
Objects с полями Object_ID и Object_name
Equipments с полями Equipment_name, System (связан с Systems.System_ID) и Object_ (связан с Objects.Object_ID)
Пользователь вводит названия prmObj и prmSys.
Можно ли его упростить?
parovoZZ (2006-09-05 14:49:00) [1]Ну да. Запрос-то не работает ни фига.
Остаётся два варианта
либо юзать [8]
либо делать выборку ID.
Aristarh Dark (2006-09-04 20:26:00) [2]Не знаю какой движок используется, но для MS SQL написал бы так.
имеем:
'SELECT Equipment_name as name FROM Equipments WHERE ' +
'((SELECT System_ID FROM Systems WHERE System_name=:prmSys)=System) and ' +
'((SELECT Object_ID FROM Objects WHERE Object_name=:prmObj)=Object_) GROUP BY Equipment_name'
и Есть три таблицы
Systems с полями System_ID и System_name
Objects с полями Object_ID и Object_name
Equipments с полями Equipment_name, System (связан с Systems.System_ID) и Object_ (связан с Objects.Object_ID)
Пользователь вводит названия prmObj и prmSys
Соответственно:
SELECT Equipment_name as [Name]
FROM (Equipments Eq LEFT JOIN System Sys ON Eq.System_ID = Sys.System_ID) LEFT JOIN Object_ Obj ON Eq.Object_ID = Obj.Object_ID
WHERE
Obj.ObjectName = :prmObj
AND
Sys.System_Name = :prmSys
GO
думается что что-то вроде этого, со скобками не уверен :) Ну а с группировкой - это надо по набору данных смотреть
Но писать так:
((SELECT System_ID FROM Systems WHERE System_name=:prmSysИМХО совсем неверно т.к. SELECT возвращает набор данных и сравнивать его с параметром негоже
Sergey13 (2006-09-04 15:59:00) [3]2 [5] parovoZZ © (04.09.06 15:42)
> [4] MaxDAG © (04.09.06 15:22)
Не подойдет?
Desdechado (2006-09-04 15:56:00) [4]Пояснения, что и где - это хорошо.
Но пока сам для себя или для нас не сформулируешь, что нужно получить в результате, вряд ли будет запрос.
parovoZZ (2006-09-04 15:42:00) [5]
> что нужно получить в результате запроса?
Есть список систем, есть список объектов. Также есть список оборудования, которое установлено на определённом объекте и относится к определённому классу систем. Например, есть записи
Радиовещание -> Квартира 10 -> радио
Радиовещание -> Квартира 10 -> 3-х радио
Телевещание -> Квартира 20 -> телевизор
Если пользователь вводит Радиовещание и Квартира 10, то ему будет предложено занести информацию о радио или о 3-х радио.
Если пользователь вводит Радиовещание и Квартира 20, то ему будет сообщено, что оборудования данной системы нет по такому адресу. Примерно так.
> > [0] parovoZZ © (04.09.06 13:41)GROUP BY - тут нафиг
> не нужен, а в остальном - что не устраивает?
Запрос выдаст
радио
радио
радио
радио
3-х радио
3-х радио
3-х радио
3-х радио
Без него никак.
> Связки с Systems и Object_ многие к одному ? Тогда лучше
> заменить на джойны.
А какую таблицу делать главной, а какую подчинённой?
Всё время юзал внутреннее связывание и всё работало. А тут вдруг стало лень перекачивать ID - ки на сторону клиента и их там сохранять.
MaxDAG (2006-09-04 15:22:00) [6]Можно:
Вариант без связывания
select a.Equipment_name as name
from Equipments a, Systems b, Objects c
where (b. System_name=:prmSys) and
(b.System_ID=a.System) and
(c. Object_name=:prmObj) and
(c. Object_ID=a. Object_)
ANB (2006-09-04 14:06:00) [7]
> Equipments с полями Equipment_name, System (связан с Systems.
> System_ID) и Object_ (связан с Objects.Object_ID)
Связки с Systems и Object_ многие к одному ? Тогда лучше заменить на джойны.
Sergey13 (2006-09-04 13:48:00) [8]> [0] parovoZZ © (04.09.06 13:41)
GROUP BY - тут нафиг не нужен, а в остальном - что не устраивает?
Desdechado (2006-09-04 13:46:00) [9]что нужно получить в результате запроса?