Программы "Простой софт" www.prostoysoft.ru

ВНИМАНИЕ! РЕКЛАМНЫЕ СООБЩЕНИЯ И ГИПЕРССЫЛКИ В ФОРУМЕ ЗАПРЕЩЕНЫ (посты удаляются автоматически)
Текущее время: 22.11.2024 22:09

Часовой пояс: UTC + 4 часа




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 45 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 31.12.2013 19:29 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
Прошу разъяснить, какая база будет быстрее работать?:
1) Есть хранимая ячейка, данные в которую вносятся по триггеру при изменении или удалении данных по формуле:
UPDATE tblMain SET LSobstSum = (SELECT IIF(ISNULL(SUM(TimeUnits / 100 * StNC)), 0, SUM(TimeUnits / 100 * StNC)) FROM tblLabour where LMainID = <tblMain>.<ID>) WHERE ID = <tblMain>.<ID>

2) Есть вычисляемая ячейка, данные в которую вносятся по формуле: SELECT IIf(ISNULL(SUM(TimeUnits / 100 * StNC)), 0, (SUM(TimeUnits / 100 * StNC)) FROM tblLabour where LMainID = <tblMain>.<ID>

Вроде бы и формула одна и таже для получения данных, но может быть есть какие-то отличия в этих вариантах, которые влияют на скорость работы базы? В каком случае база будет работать быстрее и почему?


И ещё вопрс: В справке написано: "17. Как избавиться от вычисляемых полей типа "подзапрос select в скобках"?
1. Нужно построить отдельное представление, которое уже имеет в себе все посчитанные значения для всех записей. Пример SQL-выражения этого представления: SELECT OrderID, SUM(OrderAmount) AS OrderSum FROM tblOrders GROUP BY OrderID.
2. И далее в таблице нужно "вывести поле из другой таблицы". То есть из этого представления вывести поле OrderSum. При этом построится связь между таблицами с помощью JOIN, и ни каких подзапросов не будет. Таблица будет работать быстрее и надежнее."

Мои формулы это как раз то, чего лучше избегать при построении базы или же в справке имелось ввиду что-то другое?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 10:49 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Сам процесс выполнения SQL-кода и там и там скорее всего будет занимать одинаковое время, ну может в триггере чуть дольше, т.к. там подзарос, но триггер у Вас когда выполняется? При изменении одной записи? А вычисляемое поле будет пересчитываться во всех видимых записях при каждом обновлении таблицы.

И всё же, если есть возможность реализовать потребность без триггера, то лучше его не использовать, а полностью положиться на движок СУБД.

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 11:16 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
Я тут поэкспериментировал и понял, что Триггер мне не подходит, т.к. у меня есть собственные работы и сторонние. При внесении данных в базу я перемещаюсь по вкладкам, например зашел на вкладку собственные работы и внес данные, а так как сторонних у меня нет для конкретной заявки, я даже не открываю эту вкладку. Далее, получается, что на вкладке Собственные работы тригер срабатывает на изменение, добавление записи или удаление, а на вкладке Сторонние работы тригер не сработает, т.к. никаких действий не производилось. В итоге стоимость собственных работ посчитается, а сторонних нет и нулевое значение по сторонним работам тоже не вернёт, т.к. действий не было.

В случае с вычисляемым полем стоимость собственных работ автоматически посчитается, а стоимость стороних автоматически запишется как 0.

Значит в моём случае лучше использовать вычисляемую ячейку. Но тут есть подзапрос select в скобках если я правильно понял текст в справке. Как от него избавиться не совсем понятно. Или же я что-то не так понял и у меня нет подзапроса select? Помогите, пожалуйста, с этим разобраться?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 11:59 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
При создании вычисляемого поля с формулой: (select IIf(ISNULL(SUM(TimeUnits / 100 * StNC)), 0, SUM(TimeUnits / 100 * StNC)) from tblLabour where LMainID = tblMain.ID) выдается сообщение:


Вложения:
select.jpg
select.jpg [ 86.56 КБ | Просмотров: 99106 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 12:05 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Нужно создать отдельное представление, в котором для каждого клиента уже подсчитаны нужные значения, а затем вывести нужное поле из этого представления, связав значения и текущую запись по идентификатору клиента

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 12:11 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
OMEN писал(а):
Нужно создать отдельное представление, в котором для каждого клиента уже подсчитаны нужные значения, а затем вывести нужное поле из этого представления, связав значения и текущую запись по идентификатору клиента


Иными словаи я создаю в своей базе новую таблицу qdfRasschet, в ней создаю вычисляемое поле с той же формулой, а потом вывожу данные из qdfRasschet?

Так я это и пытаюсь сделать. У меня уже есть представление qdfItog на основе tblMain, tblItog в базе отсутствует. Я поменял формулу:
(select IIf(ISNULL(SUM(TimeUnits / 100 * StNC)), 0, SUM(TimeUnits / 100 * StNC)) from tblLabour where LMainID = qdfItog.ID), т.е. tblMain.ID заменил на qdfItog.ID, но выходит тоже самое сообщение о select в скобках.

Получается, что нет разницы в представление выводить данные или в физическую таблицу, от запроса select в скобках не избавиться?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:09 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Новое представление и должно в основном состоять из Вашего подзапроса. Нужно лишь к списку выбранных полей добавить ключевое поле для связи, т.е.
Код:
SELECT m.tblMain, IIf(ISNULL(SUM(l.TimeUnits / 100 * l.StNC)), 0, SUM(l.TimeUnits / 100 * l.StNC)) FROM tblLabour AS l INNER JOIN tblMain AS m ON l.LMainID = m.tblMain


Затем уже выводите в качестве вычисляемого поле TimeUnits отсюда в ту таблицу, используя связь по полям:
LMainID = tblMain.ID

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:22 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
При попытке создать новое представление выдается сообщение об ошибке


Вложения:
1.jpg
1.jpg [ 123.97 КБ | Просмотров: 99103 ]
2.jpg
2.jpg [ 39.69 КБ | Просмотров: 99103 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:26 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Скопируйте запрос полностью

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:33 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
Ничего не получается


Вложения:
4.jpg
4.jpg [ 114.15 КБ | Просмотров: 99102 ]
3.jpg
3.jpg [ 42.7 КБ | Просмотров: 99102 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:35 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Прошу прощения, 1 января + пишу с планшета...
Код:
SELECT m.ID AS MainID, IIf(ISNULL(SUM(l.TimeUnits / 100 * l.StNC)), 0, SUM(l.TimeUnits / 100 * l.StNC)) AS TimeUnitsSUM FROM tblLabour AS l INNER JOIN tblMain AS m ON l.LMainID = m.ID GROUP BY m.ID

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:48 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
OMEN писал(а):
Прошу прощения, 1 января + пишу с планшета...
Код:
SELECT m.ID, IIf(ISNULL(SUM(l.TimeUnits / 100 * l.StNC)), 0, SUM(l.TimeUnits / 100 * l.StNC)) AS TimeUnitsSUM FROM tblLabour AS l INNER JOIN tblMain AS m ON l.LMainID = m.ID GROUP BY m.ID


Большое спасибо, представление создалось, сумма выводится. Создалось поле Expr1001 и поле ID. Я для удобства вывел таблицу в подчинённые, чтобы можно было сравнить суммы во вкладке Работы и в Новой таблице - всё сходится. Только связал подчинённую таблицу с основной через ID=ID, т.к. други полей пока нет - это лучше поправить введя новое поле, которое будет использоваться для связки с основной таблицей?

Саму формулу немного не понимаю:
названия поля Expr1001 в формуле не было
m.ID в новой таблице нет
l.TimeUnits - что значит l.?


Вложения:
5.jpg
5.jpg [ 94.51 КБ | Просмотров: 99101 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:53 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Поправил запрос, чтобы вн. имена полей были более осмысленными, обновите запрос.
m.ID выводится в новой таблице как ID, это нормально, после обновления запроса будет выводится как MainID, а Expr001 будет TimeUnitsSUM
l - это псевдоним таблицы tblLabour в запросе, m - таблицы tblMain

Для эффективной работы с запросами нужно иметь хотя бы базовые представления об SQL в MS ACCESS, все на форуме не расскажешь. С Новым годом!

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 13:59 
Не в сети

Зарегистрирован: 01.02.2011 13:58
Сообщения: 300
Теперь всё ясно, но у меня есть ещё вкладка "Материалы", "Работы сторонней организации", "Материалы сторонней организации" (см. скриншот в предыдущем сообщении). Для каждой из них нужно отдельное представление создавать или можно из каждой из этих вкладок также вывести данные в это новое представление?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01.01.2014 16:01 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Если в запросе ранее созданного представления добавить объединение и с этими таблицами, то да, можно в него вывести любые данные этих таблиц.

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 45 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB