|
|
|
Помогите упростить алгоритм создания выборки из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Здравствуйте всем! Значит, есть такая вещь. Есть 3 таблицы. Первая содержит некие данные об объектах, вторая отражает движение этих обьектов (содержит номера накладных и количество обьектов), а третья является справочником. Надо сделать выборку. Она состоит из 3 частей: 1. Данные из первой таблицы, причём часть полей в этой таблице пустует 2. Данные из третьей таблицы (заполняются как раз те поля, что пустые в первой) 3. Данные из второй таблицы, сами данные -- это просто суммы, но вот условия для суммирования кошмарные, уложиться в один запрос не удаётся. Логика такая. 1. Достаём все доступные данные из 1 таблицы. Код: plaintext 2. далее в цикле проходимся по массиву gaItem и вставляем в пустые поля соответствующие значения из справочника. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 3. увеличиваем размер (количество столбцов) массива Код: plaintext 4. в цикле вытаскиваем данные из второй таблицы (суммы по условиям) и вставляем в массив Код: plaintext 5. сбрасываем массив в таблицу. Код: plaintext 6. таблицу выводим в гриде. Код: plaintext Вот примерно так. Вопрос, собственно, в следующем: можно это всё дело как то упростить? Хотя бы общие рекомендации. А то уж больно много селектов получается. И работает это всё не так быстро как хотелось бы. (больно не бейте, я ещё только учусь) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2005, 22:53:46 |
|
||
|
Помогите упростить алгоритм создания выборки из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Общие рекомендации. Особо не вникал в задачу. Результатом всех манипуляций должна стать временная таблица. Иначе просто невозможно отобразить полученный результат в Grid. Значит, вполне логично сразу и создать эту временную таблицу (курсор). Либо напрямую командой CREATE CURSOR, либо (если возможно) запросом из первой таблицы Код: plaintext 1. 2. 3. здесь поля sum1, sum2 - это те суммы, которые будут заполнены позднее. Далее запускаешь сканирование курсора или первой таблицы (смотря как ты создал временную таблицу) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Ну, информацию из справочника можно подтянуть сразу в запросе. Менять количество столбцов в массиве - очень неблагодарное занятие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2005, 23:40:16 |
|
||
|
Помогите упростить алгоритм создания выборки из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
>Менять количество столбцов в массиве - очень неблагодарное занятие Совершенно точно. Помучавшись с AINS, я потом плюнул на это дело, и просто продублировал одно из полей таблиц нужное количество раз, хотя это и не красиво. Ваш вариант -- в принципе то же самое, но более элегантно. А про скан я и забыл. А насколько это будет быстрее перебора по циклу? Ведь это почти то же самое? Но всё равно спасибо за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2005, 23:51:38 |
|
||
|
Помогите упростить алгоритм создания выборки из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Whitish SmokeА про скан я и забыл. А насколько это будет быстрее перебора по циклу? Ведь это почти то же самое? На вскидку не скажешь. Эффективность того или иного способа зависит от конкретной задачи. Возможно, быстрее будет несколько последовательных команд Select-SQL, возможно, SCAN+SEEK (или RELATION), возможно, кобинация того и другого. Оптимизация (читай - ускорение) кода - это достаточно творческое занятие. Далеко ен всегда можно дать совет "на все случаи жизни". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2005, 00:49:55 |
|
||
|
Помогите упростить алгоритм создания выборки из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Вообще говоря, можно проверить самому. Взять какую-нибудь немаленькую таблицу и примерно так с ней обойтись: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Результаты можно бросить сюда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2005, 01:07:32 |
|
||
|
Помогите упростить алгоритм создания выборки из нескольких таблиц
|
|||
|---|---|---|---|
|
#18+
Hi Whitish Smoke! 1) Объединить таблицу1 и справочник(и) можно в одном запросе (это будет более оптимально чем потом городить реляции, сканы, реплейсы и т.п.) - просто вместо имени поля используй выражение - IIF(EMPTY(table1.field1), sprav1.field1, table1.field1) as field1 - ну идея думаю ясна. в более новых версиях фокса это-же делается через EVL(). Если под "пусто" понимается NULL - то соответственно функция NVL() 2) Если подсчёт суммы нельзя оформить простым набором элементарных функций (например типа SUM(IIF(table2.nvalue1=1, table2.nvalue2, table2.nvalue3*table2.nvalue4)-table2.nvalue5)) тогда есть 2 варианта: - нарисовать свою функцию (UDF) в которой и реализовать логику суммирования (или ещё каких-то расчётов) но считать всё только по одному элементу! Его код (table1.nPK) и передавать в эту функцию - это конечно не супер-быстрое решение, но вполне работоспособное. - сделать в первом запросе "заглушки" вида 00000.00 as nSum1 и заполнить потом всё через цикл SCAN. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2005, 01:13:58 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33086399&tid=1594163]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 462ms |

| 0 / 0 |
