Помогите с запросом для 3х таблиц... 3 in 1

Обсуждение технических вопросов работы с системами управления базами данных (СУБД), работе с языком SQL и скриптовыми языками.
Ответить
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Помогите с запросом для 3х таблиц... 3 in 1

Сообщение Александр »

Никак сообразить не могу
ситуация такая
есть объекты 3 разные типа
- 1. участники семинаров
- 2. запросы с семинаров и вообще
- 3. заказы по запросам
все они 'связаны' друг другом через разные числовые атрибуты имеющие одно значение (т.е. первые объекты со вторыми, вторые с третьими, а первые и третьи в свою очередь вообще ничем не 'связаны')

нужно сделать отчет в котором на одном листе сразу показать
1. Всех участников семинаров
2. Добавить к ним колонки с запросами, для тех кто делал
3 Добавить ко всему этому колонки с заказами которые прошли по сделанным запросам
т.е. 3 отчета по разным типам объектов на одном листе

если делать 'тройной' последовательный отчет - то на выходе я получу лишь часть данных а именно только заказы сформированные по запросам участников, а мне нужно все сразу - просто добавляя колонки от нужных объектов

Как вообще можно такое сделать - синтаксис не представляю вообще :roll: похоже надо через LEFT JOIN но как? завязать сразу три типа объектов со своими условиями отбора со сравнением нужных атрибутов и выводом значащих атрибутов в колонки?

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

или быть может все-таки по отчетам протащить все данные
т.е. первый например отобрал 2000 объектов - отдал второму нужные id например 500 тот отработал и передал третьему уже свои id тот обработал свои 20 и вывел бы в конце все исходные 2000 объектов с дополнением свойств по 500 и 20 объектам соответственно???????????????????????????????????? но как передать несуществующие id чтобы сохранить данные?

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

все поговорил сам с собой :wink: и нашел решение...
делаю фантомные экземпляры объектов нужного типа, и если один передает вместо id другому 0 подставляю туда id фантома - и протаскиваю все данные без потерь до конца цепочки :wink: :wink:
ужас короче :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

но... если есть - никто не покажет какой нибудь запрос по двум трем типам объектов и их атрибутам, с левым объединением - одновременно? :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

мне кажется, что если бы объекты были связаны не через "числовые атрибуты", а через стандартные горизонтальные связи, то это можно было бы сделать обычным отчетом. там есть возможность вытаскивать атрибут у объектов, связанных с объектом, который попал в отчет..
ну это так.. :-)
если запросом... готового у меня нет, да и сделать его не могу - не представляю пока, что там за структура данных, какие связи между объектами и логика...
но!
кажется, реально может помочь left join
у меня есть отчет с вот таким запросом (вырезал несущественные части):

Код: Выделить всё

select 
obj.id as isobject_id
,obj.type_id
,obj.description
,(
select vs.value
	from
	lsdbo.attrib_value_view av1
	,lsdbo.value_string_view vs
	where
	av1.object_id = obj.id
	and
	av1.attrib_id = 772823689700001
	and
	av1.value_id = vs.id
) as 'stage'
. . .
. . .
,select vd.value
	from
	lsdbo.attrib_value_view av1
	,lsdbo.value_datetime_view vd
	where
	av1.object_id = obj.id
	and
	av1.attrib_id = 100000543100001
	and
	av1.value_id = vd.id
) as 'date_mark'
,obj_maps.map_id as map_id
,obj_maps.begin_date
,obj_maps.subject
,obj_maps.user_to_name
,obj_maps.created
from
lsdbo.object_reference_view obj -- первая таблица
left join
lsdbo.custom_view_obj_in_maps_v obj_maps -- вторая таблица
on 
obj_maps.doc_id = obj.id
where
. . . 
. . . 
суть в том, что из первой таблицы вытаскиваются определенные объекты, но во второй таблице для ОДНОГО объекта может быть НЕСКОЛЬКО записей и надо все их показать.
поэтому использует left join (делал давно, по-другому вроде не получалось добиться того, чего хотел)
думаю, в вашем случае, Александр, можно попробовать сделать то же самое. нужно только определиться, какой делать join, левый или правый (это смотря какое число связанных записей есть в таблицах).
представить это все в одном запросе у меня не получается, но можно попробовать сделать свои виды, три штуки, для каждого типа объекта - свой вид, со своими колонками (атрибутами), а потом в запросе просто связать эти виды через определенные join по определенным числовым атрибутам (которые конечно должны быть в каждом виде...)
может, так получится?..
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

Андрей спасибо за ответ, давай посмотрим более предметно
вот два запроса

Код: Выделить всё

SELECT lsdbo.object_reference_view.description as c_Name,
           (SELECT vv.value 
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_string_view vv 
            WHERE av.value_id = vv.id 
                         AND av.object_id = lsdbo.object_reference_view.id 
                         AND av.treelink_id = 0 
                         AND av.attrib_id = 100004068400000) as c_company,
           (SELECT vv.value 
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_numeric_view vv 
            WHERE av.value_id = vv.id 
                         AND av.object_id = lsdbo.object_reference_view.id 
                         AND av.treelink_id = 0 
                         AND av.attrib_id = 100004060200000) as c_contact
 FROM lsdbo.object_reference_view,
            lsdbo.object_type_view    
WHERE (lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id)
             AND (lsdbo.object_type_view.mnemo = 'Lst')

Код: Выделить всё

SELECT 
           (SELECT vv.value 
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_string_view vv 
            WHERE av.value_id = vv.id 
                         AND av.object_id = lsdbo.object_reference_view.id 
                         AND av.treelink_id = 0 
                         AND av.attrib_id = 100000063100000) as c_request,
           (SELECT vv.value 
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_numeric_view vv 
            WHERE av.value_id = vv.id 
                         AND av.object_id = lsdbo.object_reference_view.id 
                         AND av.treelink_id = 0 
                         AND av.attrib_id = 100004081100000) as c_contact
 FROM lsdbo.object_reference_view,
            lsdbo.object_type_view    
WHERE (lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id)
             AND (lsdbo.object_type_view.mnemo = 'Req')
которые я хочу объединить в один - по разным атрибутам c_contact - значение и смысл которых один и тотже в данном случае (один и тот же указатель)
т.е. в условии значения этих двух атрибутов от разных типов объектов должны быть равны друг другу
при этом хотелось бы иметь все колонки сразу (c_Name, c_company, c_contact +c_request, c_contact) т.е. от двух в одном...

Но не могу понять как синтаксически сделать объединение первого запроса со вторым через left join
ps
нифига не понимаю в этих таблицах :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

упс... все же уже давно решено здесь же и по моему самим же :wink: :wink:

во как можно

Код: Выделить всё

Select *
  From
--первый запрос 
/************************************************************************************************/ 
(
SELECT lsdbo.object_reference_view.description as c_Name,
           (SELECT vv.value
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_string_view vv
            WHERE av.value_id = vv.id
                         AND av.object_id = lsdbo.object_reference_view.id
                         AND av.treelink_id = 0
                         AND av.attrib_id = 100004068400000) as c_company,
           (SELECT vv.value
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_numeric_view vv
            WHERE av.value_id = vv.id
                         AND av.object_id = lsdbo.object_reference_view.id
                         AND av.treelink_id = 0
                         AND av.attrib_id = 100004060200000) as c_contact
 FROM lsdbo.object_reference_view,
            lsdbo.object_type_view   
WHERE (lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id)
             AND (lsdbo.object_type_view.mnemo = 'Lst')
)as Table01

left join 

--второй запрос 
/************************************************************************************************/
 (
SELECT
           (SELECT vv.value
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_string_view vv
            WHERE av.value_id = vv.id
                         AND av.object_id = lsdbo.object_reference_view.id
                         AND av.treelink_id = 0
                         AND av.attrib_id = 100000063100000) as c_request,
           (SELECT vv.value
               FROM lsdbo.attrib_value_view av,
                          lsdbo.value_numeric_view vv
            WHERE av.value_id = vv.id
                         AND av.object_id = lsdbo.object_reference_view.id
                         AND av.treelink_id = 0
                         AND av.attrib_id = 100004081100000) as c_contact
 FROM lsdbo.object_reference_view,
            lsdbo.object_type_view   
WHERE (lsdbo.object_reference_view.type_id = lsdbo.object_type_view.id)
             AND (lsdbo.object_type_view.mnemo = 'Req')
)as Table02

on Table01.c_contact=Table02.c_contact
собственно то что надо - только данных чето больше выдает на 500 штук :wink: :wink: но больше - не меньше!
Последний раз редактировалось Александр 11 июл 2008, 09:29, всего редактировалось 1 раз.

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

опа... и так можно что ли?? :-)))
ну и как, в итоге все работает значит? кул... :-)
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

да все работает - щас разберусь откуда лишнее и добавлю сюда еще пару запросов :wink: :wink: :wink:

ps
кстати это было здеся
http://www.lplm.ru/phpBB2/viewtopic.php ... sc&start=0
мы с тобой чегото там решали :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

все - вопрос снят - работает - все круто!!! интересно на SQL2005 когда в ограничение по количеству столбцов или чего то там еще воткнусь :wink: :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

19 колонок и неизвестно сколько таблиц - ограничения не достиг
в MSSQL2000 больше 11 колонок не получалось! Круто

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

эх... тоже что ли переползти на 2005....
Александр, а вы не пробовали Reporting Services от 2005-го? там вроде как можно делать отчеты по данным и показывать их в красивом виде... даже вывешивать на портал SharePoint...
а??
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Сообщение Александр »

Reporting Services и SharePoint??????????? если бы я еще знал что это такое :wink: :wink: :wink:

нет не пробовал - все только в Лоции родной - стараюсь не выходить из нее никуда....

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Сообщение Anderyt »

мы на этом сделали корпоративный портал, например..
вот немного о технологии:
http://www.microsoft.com/Rus/SharePoint/Default.mspx
(надеюсь, это можно делать на этом форуме ;-) )
у него есть какие то возможности документооборота, но нам это не нужно, докоборот у нас на Лоции. да и работа с документами - тоже.
мы его юзаем исключительно как ресурс для информационной поддержки пользователей и сотрудников (ну, в принципе, некоторые вещи и автоматизируем в нем, когда нужно сделать что то очень простое и очень быстро)
а Reporting Services.. вот они (что смог найти):
http://www.microsoft.com/rus/bi/product ... vices.aspx
насколько я понял, из этого можно сделать систему публикования отчетов (диаграмм) на портале, причем источником данных для этих отчетов будет база данных сиквела 2005. ессно возникла мысль вывешивать некую аналитику по данным в Лоции на портал. ведь вроде как эти отчеты можно формировать по расписанию, ночью например, а когда юзер будет заходить на страницу, они будут показываться почти мнгновенно..
то есть, в Лоции данные обрабатываются и изменяются, а на портале - просматриваются определенными лицами, в картинках, быстро и все такое (хоть и не совсем актуальные...)
лучше день потерять, потом за пять минут долететь!
Ответить