Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
1

Ошибка при выполнении запроса

13.08.2013, 19:27. Показов 1548. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер! (под вечер голова уже перестала работать)
Есть простенькая БД, в ней одна таблица главная, две подчиненные.
Необходимо запросом в TDBGrid вывести суммарные данные определенных столбцов из этих двух таблиц, получилось следующее:
SQL
1
2
3
SELECT Main_Table.Address, SUM(First_Table.Summ) AS [Сумма первой таблицы], SUM(Second_Table.Sum_Second) AS [Сумма второй таблицы]
FROM (Main_Table INNER JOIN First_Table ON Main_Table.id = First_Table.id_Main) INNER JOIN Second_Table ON Main_Table.id = Second_Table.id_Main
GROUP BY Main_Table.Address
Структура БД в приложении.
Проблема следующая: если выводить данные суммы одной любой из таблиц - суммирование происходит правильно, при выводе данных вышеописанным запросом из обеих подчиненных - количество данных удваивается...
Вопрос: где подвох, как поправить SQL-запрос?!
Миниатюры
Ошибка при выполнении запроса  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2013, 19:27
Ответы с готовыми решениями:

Ошибка при выполнении запроса Trying to store a string of length 30 into field that can only contain 20
Добрый день! Возникла проблема с IBQ... with IBQSPRED do begin close; SQL.Clear; ...

При выполнении запроса, зависает программа
Добрый день уважаемые форумчане и гуру Delphi. Подскажите пожалуйста. Выполняю такой код программы...

Как убрать часики при выполнении SQL запроса?
Здраствуйте ребята, нужна срочная помощь. То что нужно сделать написано в названии темы.SQL запрос...

Мин и Макс в Fast report при выполнении запроса
Скажите я выполняю запрос, вес нормально работает так как надо, но когда я вывожу на печать или...

6
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
14.08.2013, 00:50 2
Ситуация воспроизведена, практически, один-в-один в Аксесс 2003.
Что-то не получается у меня удвоения количества данных. Запрос отрабатывает как надо.
СУБД то какая?

И лучше делать левое соединение (LEFT JOIN), если существует вероятность что
в одной из подчиненных таблиц не найдется сумм для какого-нибудь адреса.
1
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
14.08.2013, 16:43  [ТС] 3
СУБД Access 2007, БД сохранена в формате 2003. Вот сам файл...
Вложения
Тип файла: rar SimpleBD.rar (12.3 Кб, 9 просмотров)
0
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
14.08.2013, 16:45  [ТС] 4
SQL
1
2
3
SELECT Main_Table.Address, SUM(First_Table.Summ) AS [Сумма первой таблицы], SUM(Second_Table.Sum_Second) AS [Сумма второй таблицы]
FROM (Main_Table LEFT JOIN First_Table ON Main_Table.id = First_Table.id_Main) LEFT JOIN Second_Table ON Main_Table.id = Second_Table.id_Main
GROUP BY Main_Table.Address
Добавил LEFT JOIN, запрос выводит адреса даже с пустыми значениями, и это верно. Но удвоение остается, черт бы его побрал
0
1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
14.08.2013, 20:11 5
Действительно, если в точности запрос воспроизвести, то суммы по второй объединенной таблице удваиваются, утраиваются и т.д.
Зависит от количества записей по одной и той же группировке в первой подчиненной таблицы.
Если вторую подчиненную объединять по первой подчиненной, а не по главной, то артефакта удвоения не будет (в приведенном заросе наименования немного сокращены):
SQL
1
2
3
SELECT Main.Address, SUM(FIRST.summa) AS S1, SUM(SECOND.sum_sec) AS S2
FROM (Main INNER JOIN FIRST ON Main.id=FIRST.id_Main) LEFT JOIN SECOND ON FIRST.Id=SECOND.id_main
GROUP BY Main.Address
Добавлено через 3 минуты
Правда, получается критическая зависимость представляемых сумм во второй таблице от записей в первой подчиненной. Т.е. этот запрос тоже не корректен.

Добавлено через 5 минут
Хм, к тому же, выше чушь написана. Надо бы этот текст запроса к стенке (ну, или автора).

Добавлено через 29 минут
Если это, действительно, Аксесс, то благополучия удалось достигнуть отдельными запросами.
SQL
1
2
3
4
5
6
7
8
9
10
11
--запрос под именем Query1:
SELECT Main.Address, SUM(FIRST.Summa) AS S1
FROM Main LEFT JOIN [FIRST] ON Main.id=FIRST.id_Main GROUP BY Main.Address;
 
--запрос под именем Query2:
SELECT Main.Address, SUM(SECOND.Sum_Sec) AS S2
FROM Main LEFT JOIN [SECOND] ON Main.id=SECOND.id_Main GROUP BY Main.Address;
 
--и объединяющий суммы запрос:
SELECT Query1.Address, Query1.S1, Query2.S2
FROM Query1, Query2 WHERE Query1.Address = Query2.Address
Два первых остаются в базе как временные таблицы, последний выполняется из Дельфи.
1
71 / 71 / 7
Регистрация: 19.07.2011
Сообщений: 357
15.08.2013, 01:13 6
можно обойтись одним запросом

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
M.Address
,A.S1
,B.S2
FROM (Main_Table M
inner join 
(
select 
id_Main
,SUM(Summ) as  S1
from First_Table
group by id_Main
) A on M.Id=A.Id_Main)
left  join 
(
select 
id_Main
 ,SUM(Sum_Second) as S2
from Second_Table
group by id_Main
) B on M.Id=B.Id_Main
(но до чего ж уродский синтаксис в аксесе!!!)
1
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
15.08.2013, 05:23  [ТС] 7
Цитата Сообщение от Скандербег Посмотреть сообщение
Если это, действительно, Аксесс, то благополучия удалось достигнуть отдельными запросами.
Автор, действительно, Access ... Повторов избежал так же, при помощи отдельных запросов
Я уже грешным делом думал, что я делаю что-то не так
0
15.08.2013, 05:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2013, 05:23
Помогаю со студенческими работами здесь

Ошибка при выполнении ADOCommand
Здравствуйте, подскажите что означает ошибка "Попытка выполнить запрос,который не включает...

Ошибка при выполнении базы
делал базуданных тел справочник. почти сделал и тут в конце выскакивает Project telephone.exe...

Ошибка при выполнении многошаговой операции
По нажатию на кнопку должна заполняться таблица ADOTABLE1, но не заполняется из за ошибки "Ошибка...

Firebird ошибка при выполнении selectSQL
Здравствуйте. При работе с SelectSQL выдает ошибку, что не найдено ключевое поле Field id_enet not...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru