powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе
19 сообщений из 44, страница 2 из 2
Дублирование данных в запросе
    #32333376
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пробовал. А надо ли? Вот такая строка сама по себе отрабатывается моментально:
Код: plaintext
1.
2.
SELECT sum(Nz(Cash.Эквивалент1, 0 )) 
FROM cash 
WHERE Cash.[Реф №]  = (select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145')
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333383
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А весь запрос без этой строки?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333387
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без нее работает быстро!
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333400
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WHERE Cash.[Реф №] = (select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]= t.[Реф №])?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333404
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333420
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sum(Nz(Cash.Эквивалент1,0))
FROM cash, Calc
WHERE (Calc.[Реф №] = t.[Реф №] AND Calc.Статус='получено') AND (Cash.[Реф №] = Calc.[Реф №])

???
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333427
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считает быстро, но вместо 1985,9 в поле число 5957,8.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333442
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут идет такое же дублирование как и то, о котором я говорил вначале топика. Результат превышает реальный ответ ровно в 4 раза
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333445
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее в 3 раза :)
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333462
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторю вопрос для вновь прибывших:
Есть нормально работающий запрос
Код: plaintext
1.
2.
3.
SELECT sum(Nz(Cash.Эквивалент1, 0 )) 
FROM cash 
WHERE Cash.[Реф №]  =
(select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145')

Но, если этот запрос вставить в другой запрос, то скорость замедляется в ДЕСЯТКИ раз
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, 
(SELECT Nz(sum(calc.Эквивалент2), 0 ) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость,
(SELECT Nz(sum(cash.Эквивалент1), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к,
(SELECT Nz(sum(bank.Эквивалент1), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б,
(SELECT Nz(sum(cash.Эквивалент2), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, 
(SELECT Nz(sum(bank.Эквивалент2), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б,
(SELECT Nz(Sum(Cash.Эквивалент1), 0 ) from cash Where cash.[Реф №] = 
(SELECT TOP  1  [реф №] from calc Where Calc.Статус='получено' AND Calc.[Реф №]= t.[реф №])) AS Получено_пост, 
CDbl(Приход_к)+CDbl(Приход_б) AS Опл_зак, 
CDbl(Расход_к)+CDbl(Расход_б) AS Опл_фирм, 
CDbl([Стоимость])-CDbl(Себестоимость) AS Доход
FROM Orders AS t
WHERE t.[дата начала] Between # 4 / 9 / 2003 # And # 9 / 9 / 2003 #;

Как оптимизировать такой запрос???
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333464
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатка во втором запросе: вместо "TOP 1" д.б. distinct
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333860
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>то скорость замедляется в ДЕСЯТКИ раз

ничего удивительного. Для _каждой_ записи конечного запроса вычисляется по нескольку группировочных запросов.
Если задача сформулирована правильно, то есть например такой способ:
1. предположим, что полное число [реф №] невелико. Тогда вместо вычисления запросов вида {SELECT Nz(sum(calc.Эквивалент2)...} для _каждой_ записи общего запроса надо выполнить некий запрос с ГРУППИРОВКОЙ по [реф №], а уж его цеплять внешним джойном к результирующему запросу. Можно даже складирвать результаты группировки в темповую таблицу.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338590
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  SELECT DISTINCT t.[Реф №], t.Наименование, t.Потребитель, nz(t.Эквивалент, 0 ) AS Стоимость, t.Количество,
        (SELECT Nz(sum(calc.Эквивалент2), 0 ) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость, 
        (SELECT Nz(sum(cash.Эквивалент1), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к, 
        (SELECT Nz(sum(bank.Эквивалент1), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б, 
        (SELECT Nz(sum(cash.Эквивалент2), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, 
        (SELECT Nz(sum(bank.Эквивалент2), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б, 
        CDbl(Приход_к) + CDbl(Приход_б) as Опл_зак, 
        CDbl(Расход_к) + CDbl(Расход_б) as Опл_фирм, 
        CDbl(Стоимость) - CDbl(Себестоимость) as Доход_пл, 
        ((CDbl(Приход_к) + CDbl(Приход_б)) - (CDbl(Расход_к) + CDbl(Расход_б))) as Доход_р, 
        (SELECT Nz(sum(Realization.Эквивалент1), 0 ) from Realization Where Realization.[реф №] = t.[реф №]) as Получ_от_пост, 
        (SELECT Nz(sum(Realization.Эквивалент2), 0 ) from Realization Where Realization.[реф №] = t.[реф №]) as Отпущ_кл 
        FROM Orders AS t

Если обрабатывать большое количество записей, то работает очень долго.
Есть ли способы ускорения этого запроса (например, выполнение по частям или что-нибудь еще)?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338620
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы не сделать группировочные запросы для каждой таблицы, по которой надо посчитать сумму? А потом использовать RIGHT JOIN. По крайней мере для таблиц cash и bank окажется по одному запросу вместо двух в приведенном примере.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338707
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT DISTINCT t.[Реф №], t.Наименование, t.Потребитель, nz(t.Эквивалент, 0 ) AS Стоимость, t.Количество,
Nz(Sum(cash.Эквивалент1), 0 ) AS Приход_к, 
Nz(Sum(cash.Эквивалент2), 0 ) AS Расход_к, 
Nz(Sum(bank.Эквивалент1), 0 ) AS Приход_б, 
Nz(Sum(bank.Эквивалент2), 0 ) AS Расход_б, 
Nz(Sum(calc.Эквивалент2), 0 ) AS Себестоимость, 
Nz(Sum(Realization.Эквивалент1), 0 ) AS Получ_от_пост,
Nz(Sum(Realization.Эквивалент2), 0 ) AS Отпущ_кл, 
CDbl(Приход_к)+CDbl(Приход_б) AS Опл_зак, 
CDbl(Расход_к)+CDbl(Расход_б) AS Опл_фирм, 
CDbl(Стоимость)-CDbl(Себестоимость) AS Доход_пл, 
((CDbl(Приход_к)+CDbl(Приход_б))-(CDbl(Расход_к)+CDbl(Расход_б))) AS Доход_р
FROM (((Orders AS t LEFT JOIN Cash ON t.[Реф №] = Cash.[Реф №]) LEFT JOIN Bank ON t.[Реф №] = Bank.[Реф №])
LEFT JOIN Realization ON t.[Реф №] = Realization.[Реф №]) LEFT JOIN Calc ON t.[Реф №] = Calc.[Реф №]
GROUP BY t.[Реф №], t.Наименование, t.Потребитель, nz(t.Эквивалент, 0 ), t.Количество;

Работает очень быстро, но появляется проблема из-за которой я и завел этот топик: значения больше реальных в 12 раз (это не постоянное число раз). Причем, чем меньше "Join'ов" тем в меньшее число раз полученное значение превышает реальное
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338716
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я немного не об этом ;)
Можно же сделать для каждой из нужных таблиц _отдельный_ запрос с группировкой по нужному полю, например:
Код: plaintext
1.
SELECT [Реф №], Sum(bank.Эквивалент1) AS E1, Sum(bank.Эквивалент2) AS E2
FROM bank GROUP BY [Реф №]

и соединить его через RIGHT JOIN с основной таблицей!
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338733
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае нужно заводить массу хранимых запросов, а мне желательно сделать это все в программе (этот запрос служит для открытия рекордсета).
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338742
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для данного запроса получится всего три запроса (по одному к каждой вспомогательной таблице). И, между прочим, сохраненные запросы должны поднять быстродействие.
ИМХО здесь не получится "и рыбку съесть, и..."
Впрочем, наше дело предложить... Других выходов все равно не предвидится, так что решай сам. Мне больше предложить нечего.
Кстати, я бы отказался от такого наименования поля как "№ реф".
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338743
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все отлично работает. Спасибо
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]