Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложные SQL запросы, не получается решить проблему 
:(
    Опции темы
Geparder
Дата 17.1.2012, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.7.2011

Репутация: нет
Всего: нет



Задача состоит в составлении пользовательских отчетов. Нужно накладывать различные условия на различные поля, выбирать поля и их последовательность отображения. 
Таблицы имеют иерархическую зависимость и отображать их следует в таком же виде. Я это делаю с помощью ORDER BY.
Пример части получившегося запроса                
user posted image    

Решить поставленную задачу удалось, всё отображается, но вот когда условия накладываются одновременно на различные таблицы в одном запросе, то такой сложный запрос не выполнется.
Думаю не стоит так загружать сервер. Может загружать таблицы в чистом виде, а потом их из памяти обрабатывать. Может поможет LINQ to Objects? Но как там можно программно менять запрос в зависимости от условий?
Ниже приведен пример SQL запроса, который не получилось выполнить:
user posted image
Код

SELECT 1 AS __level
                             , firms.id AS id_org
                             , firms.name
                             , region.name AS region
                             , goroda.name AS gorod
                             , obnov.name AS obn
                             , firms.addr
                             , firms.prim_addr
                             , firms.tel
                             , firms.fax
                             , firms.email 
                             , '' AS key_name
                             , '' AS type_key
                             , '' AS kol_mest
                             , '' AS vid_key
                             , '' AS vers_key
                             , '' AS data_start
                             , '' AS data_end
                             , '' AS new_adr
                             , '' AS prim
                             , 0 AS id_key 
                             , '' AS name_nb
                             , '' AS type_nb
                             , '' AS stat_nb
                             , '' AS pay_nb
                             , '' AS date_nb
                             , 0 AS id_nb 
                             , '' AS god
                             , '' AS kvart
                             , '' AS stat_ind
                             , '' AS pay_ind
                             , '' AS date_ind
                             , '' AS mat_ind 
                        FROM
                          firms
                        JOIN region
                        ON region.id = firms.id_region
                        JOIN goroda
                        ON goroda.id = firms.id_gorod
                        JOIN obnov
                        ON obnov.id = firms.id_obn  where firms.id in (select nb_temp.id_org from ind JOIN (SELECT rik_keys.id_org, 
                nb.id, nb.id_key FROM nb JOIN rik_keys ON rik_keys.id = nb.id_key) AS nb_temp on 
                    nb_temp.id = ind.id_nb JOIN nb ON nb.id = ind.id_nb  where ind.id_stat='6' and nb.id_key in (select rik_keys.id from rik_keys  where rik_keys.id_type='1')) and firms.id in (select rik_keys.id_org from rik_keys  where rik_keys.id_type='1' and rik_keys.id in (select nb.id_key from ind JOIN (SELECT nb.id
                                   , nb.id_key
                                   , rik_keys.id_org
                              FROM
                                nb
                              JOIN rik_keys
                              ON rik_keys.id = nb.id_key) AS nb_temp
                        ON nb_temp.id = ind.id_nb
                        JOIN nb
                        ON nb.id = ind.id_nb  where ind.id_stat='6')) UNION ALL SELECT 2 AS __level
                             , rik_keys.id_org
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , rik_keys.key_name
                             , vkeys.name AS type_key
                             , CAST(rik_keys.kol_mest AS char(10))
                             , vkey.name AS vid_key
                             , vprog.name AS vers_key
                             , CAST(rik_keys.data_start AS char(10))
                             , CAST(rik_keys.data_end AS char(10))
                             , rik_keys.new_adr
                             , rik_keys.prim
                             , rik_keys.id AS id_key
                             , '' AS name_nb
                             , '' AS type_nb
                             , '' AS stat_nb
                             , '' AS pay_nb
                             , '' AS date_nb
                             , 0 AS id_nb 
                             , '' AS god
                             , '' AS kvart
                             , '' AS stat_ind
                             , '' AS pay_ind
                             , '' AS date_ind
                             , '' AS mat_ind 
                        FROM
                          rik_keys
                        JOIN vkeys
                        ON vkeys.id = rik_keys.id_type
                        JOIN vkey
                        ON vkey.id = rik_keys.id_vid
                        JOIN vprog
                        ON vprog.id = rik_keys.id_vers  where rik_keys.id_type='1' and rik_keys.id in (select nb.id_key from ind JOIN (SELECT nb.id
                                   , nb.id_key
                                   , rik_keys.id_org
                              FROM
                                nb
                              JOIN rik_keys
                              ON rik_keys.id = nb.id_key) AS nb_temp
                        ON nb_temp.id = ind.id_nb
                        JOIN nb
                        ON nb.id = ind.id_nb  where ind.id_stat='6') UNION ALL SELECT 3 AS __level
                             , rik_keys.id_org
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , '' AS key_name
                             , '' AS type_key
                             , '' AS kol_mest
                             , '' AS vid_key
                             , '' AS vers_key
                             , '' AS data_start
                             , '' AS data_end
                             , '' AS new_adr
                             , '' AS prim
                             , nb.id_key
                             , vnb.name AS name_nb
                             , vnb.type_nb
                             , stats.name AS stat_nb
                             , IF( nb.pay = '1', 'Да', 'Нет' ) AS pay_nb
                             , CAST(nb.date_pay AS char(10)) AS date_nb
                             , nb.id AS id_nb 
                             , '' AS god
                             , '' AS kvart
                             , '' AS stat_ind
                             , '' AS pay_ind
                             , '' AS date_ind
                             , '' AS mat_ind 
                        FROM
                          nb
                        JOIN (select vnb.id,vnb.name,vnb.type,vnb_all.name as type_nb from vnb join vnb_all on vnb_all.id=vnb.type) as vnb
                        ON vnb.id = nb.id_type_nb
                        JOIN rik_keys
                        ON rik_keys.id = nb.id_key
                        JOIN stats
                        ON stats.id = nb.id_stat  where nb.id in (select ind.id_nb from ind JOIN (SELECT nb.id
                                   , nb.id_key
                                   , rik_keys.id_org
                              FROM
                                nb
                              JOIN rik_keys
                              ON rik_keys.id = nb.id_key) AS nb_temp
                        ON nb_temp.id = ind.id_nb
                        JOIN nb
                        ON nb.id = ind.id_nb  where ind.id_stat='6' and nb.id_key in (select rik_keys.id from rik_keys  where rik_keys.id_type='1')) and nb.id_key in (select rik_keys.id from rik_keys  where rik_keys.id_type='1' and rik_keys.id in (select nb.id_key from ind JOIN (SELECT nb.id
                                   , nb.id_key
                                   , rik_keys.id_org
                              FROM
                                nb
                              JOIN rik_keys
                              ON rik_keys.id = nb.id_key) AS nb_temp
                        ON nb_temp.id = ind.id_nb
                        JOIN nb
                        ON nb.id = ind.id_nb  where ind.id_stat='6')) UNION ALL SELECT 4 AS __level
                             , nb_temp.id_org
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , ''
                             , '' AS key_name
                             , '' AS type_key
                             , '' AS kol_mest
                             , '' AS vid_key
                             , '' AS vers_key
                             , '' AS data_start
                             , '' AS data_end
                             , '' AS new_adr
                             , '' AS prim
                             , nb.id_key
                             , '' AS name_nb
                             , '' AS type_nb
                             , '' AS stat_nb
                             , '' AS pay_nb
                             , '' AS date_nb
                             , ind.id_nb
                             , CAST(ind.god AS char(10))
                             , CAST(ind.kvart AS char(10))
                             , stats.name AS stat_ind
                             , IF( ind.pay = '1', 'Да', 'Нет' ) AS pay_ind
                             , CAST(ind.date_pay AS char(10)) AS date_ind
                             , IF( ind.mat = '1', 'Да', 'Нет' ) AS mat_ind
                        FROM
                          ind
                        JOIN (SELECT nb.id
                                   , nb.id_key
                                   , rik_keys.id_org
                              FROM
                                nb
                              JOIN rik_keys
                              ON rik_keys.id = nb.id_key) AS nb_temp
                        ON nb_temp.id = ind.id_nb
                        JOIN nb
                        ON nb.id = ind.id_nb
                        JOIN stats
                        ON stats.id = ind.id_stat  where ind.id_stat='6' and nb.id_key in (select rik_keys.id from rik_keys  where rik_keys.id_type='1') ORDER BY id_org ,id_key ,id_nb,  __level ;


Это сообщение отредактировал(а) Geparder - 17.1.2012, 05:24
PM MAIL   Вверх
jonie
Дата 18.1.2012, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



ну сделайте чтобы у вас нормальный (выполняемый) запрос генерировался. Мы при чем?
Если хотите в памяти на клиете это делать тогда курите в сторону DLINQ и ExpressinsTree.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ninasus
Дата 12.4.2012, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.4.2012

Репутация: нет
Всего: нет



У вас что там гигабайты информации обробляются? Если да, то и в память Вы все таблицы особо не загрузите. Для быстрого выполнения селектов работайте на сервере БД и настройне инлексы в БД.

Цитата

Но как там можно программно менять запрос в зависимости от условий
Кстати какая у Вас БД?  На MS SQL можно использовать динамический sql.
PM MAIL WWW   Вверх
erm0l0v
Дата 13.4.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: нет
Всего: 1



По поводу программного изменения Linq запроса погуглите про спецификаторы.

Возможно вы упростите жизнь SQL серверу если добавите таблицы с промежуточными данными, можно например выделить несколько основных отчетов и записать их в БД(и подправлять при добавлении новых данных) и иже из этих таблиц вы сможете строить конечные отчеты.

Сохранять данные в памяти не очень хорошо, может лучше локальную БД. Вы можете воспользоваться Sync Framework для синхронизации локальной БД с основной...
PM MAIL   Вверх
jonie
Дата 17.4.2012, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



Цитата(ninasus @  12.4.2012,  10:11 Найти цитируемый пост)
У вас что там гигабайты информации обробляются? Если да, то и в память Вы все таблицы особо не загрузите. 

я когда говорил "в памяти" имел в виду сделать sql выражение на стороне клиента используя Expressions-ы


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1008 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.