powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе
25 сообщений из 44, страница 1 из 2
Дублирование данных в запросе
    #32332025
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
SELECT sum(cash.эквивалент1) as a
FROM Calc LEFT JOIN Cash ON Calc.[Реф №] = Cash.[Реф №]
WHERE (((Calc.Статус)= "Получено" ) AND ((Cash.[Реф №])='12=145'));

Результат этого запроса в два раза больше, чем есть на самом деле.

Проверял, что там происходит так:
Код: plaintext
1.
2.
SELECT cash.* as a
FROM Calc LEFT JOIN Cash ON Calc.[Реф №] = Cash.[Реф №]
WHERE (((Calc.Статус)= "Получено" ) AND ((Cash.[Реф №])='12=145'));

Количество возвращенных строк = кол-во нужных строк в таблице cash *
кол-во нужных строк в таблице calc
почему так происходит?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332031
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT cash.* as a - это опечатка :)
следует читать как SELECT cash.*
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332123
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
автор писал:Проверял, что там происходит так:
Там - это где?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332128
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверял, что происходит в запросе.
Первый вариант возвращал одно только число - вот я и посмотрел, что "там" со строками происходит
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332132
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Даны два запроса. Первый неправильный, а второй "там". Каким образом второй получен из первого? И откуда известно, что второй правильный?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332138
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч,первый запрос с Sum, второй почти такой же ,но без суммирования,возвращающий все записи.Умение внятно формулировать свои мысли не относится к главным достоинствам VsevolodV (впрочем как и к моим),
но в данном случае все понятно.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332139
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом второй получен из первого?
SELECT cash.*
вместо
SELECT sum(cash.эквивалент1) as a

И откуда известно, что второй правильный?
Просто я посмотрел, что происходит со строками при таком джойне и условии where.
Он неправильный - в нем ровно в два раза больше строк, чем должно быть,т.е.
Код: plaintext
1.
2.
3.
4.
ID_OPER     Приход
    1            23 
    2            45 
    1            23 
    2            45 

ID_OPER - порядковый номер операции
Если в таблицу Calc добавить еще одну строку, удовлетворяющую условию, то запрос даст нам в три раза больше строк, т.е. будет
Код: plaintext
1.
2.
3.
4.
5.
6.
ID_OPER     Приход
    1            23 
    2            45 
    1            23 
    2            45 
    1            23 
    2            45 
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332142
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VsevolodV
Скорее всего у тебя в какой то из таблиц есть дубликаты, или джойнишь неправильно
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332144
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ID_OPER - ключевое поле
Пробовал INNER JOIN, LEFT JOIN и RIGHT JOIN - результат не изменялся
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332149
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и где в твоих запросах используется ID_OPER ?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332151
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так его вроде и не нужно использовать - таблицы связываются по полю [Реф №]
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332154
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Провел эксперимент:
Новый МДБ. Создал в нем две таблици Calc и Cash:
Calc:
Код: plaintext
1.
2.
3.
 Реф №   Статус
 12 = 145   Получено
 12 = 145   Получено
 12 = 145   Получено


Cash:
Код: plaintext
1.
2.
 Реф №   Приход
 12 = 145        15 
 12 = 145        5 


Запрос:
Код: plaintext
1.
2.
SELECT cash.*
FROM Calc LEFT JOIN Cash ON Calc.[Реф №] = Cash.[Реф №]
WHERE (((Calc.Статус)= "Получено" ) AND ((Cash.[Реф №])='12=145'));


Результат запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
 Реф №   Приход
 12 = 145        15 
 12 = 145        15 
 12 = 145        15 
 12 = 145        5 
 12 = 145        5 
 12 = 145        5 
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332161
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod,читай мой пост от 14:49
У тебя 3 строкам из Calc соответствуют 2 строки из Cash.В результате соединения ты получишь (и получаешь) 6 строк результирующего набора.
И объясни мне, зачем хранить в таблицах дубликаты?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332415
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит дубликат?
Если имеется ввиду, что одна запись записана два раза, то такого нет.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332434
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите разобраться. По-моему, сам запрос "в корне" составлен неправильно.
Нужно вот что: Если в строках с определенным [Реф №] таблицы Calc есть хотя бы одна строка, в которой статус = "Получено", то по этому [Реф №] нужно посчитать sum(cash.эквивалент1) из таблицы Cash соответственно.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332437
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так по-моему будет правильнее:
Код: plaintext
1.
2.
SELECT Nz(sum(Cash.Эквивалент1), 0 )
FROM cash
WHERE Cash.[Реф №]  in  (select [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145');

Но тут проблема в том, что почему то этот запрос выполняется втечение 30 секунд.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332443
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так работает быстро:
Код: plaintext
1.
2.
SELECT Nz(sum(Cash.Эквивалент1), 0 )
FROM cash
WHERE Cash.[Реф №]  = (select TOP  1  [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145');

Но если этот запрос вставить в основной запрос, то работа очень сильно замедляется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    Str1 =  "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 " 

Что тут можно предпринять?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333224
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В зависимости от условия WHERE запрос может выполняться 5 минут и более :(
Должны же быть какие-нибудь пути оптимизации.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333257
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге я прихожу к выводу, что и этот запрос не работает :(
Допустим в таком варианте поле "Получено_пост" всегда равняется 0
Код: 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 # 14 / 09 / 2003 # and # 20 / 09 / 2003 #

Я уже вообще ничего не понимаю :( Почему не работает??? Что делать???
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333264
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
автор писал:between #14/09/2003# and #20/09/2003#
В селектах даты пишутся по MMDDYYYY! Этому посвящена половина форума.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333277
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой! Забыл :)
Но это не влияет на расчет вышеуказанного поля.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333321
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
SELECT sum(Nz(Cash.Эквивалент1, 0 ))
FROM cash
WHERE Cash.[Реф №]  = 
(select distinct [реф №] from calc 
where Calc.Статус='получено' 
AND Calc.[Реф №]='12=145');
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333346
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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 sum(Nz(Cash.Эквивалент1, 0 )) FROM cash WHERE Cash.[Реф №]  =
(select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145')) AS Получено_пост, 
       CDbl(Приход_к) + CDbl(Приход_б) as Опл_зак, 
       CDbl(Расход_к) + CDbl(Расход_б) as Опл_фирм, 
       CDbl(Стоимость) - CDbl(Себестоимость) as Доход 
       FROM Orders AS t 
where t.[дата начала]  between # 02 / 04 / 2002 # and # 09 / 09 / 2004 #

Работает быстро, но поле Получено_пост = NULL
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333349
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыдущего поста НЕ БЫЛО :)
Я забыл t.[реф №].
---
работает долго! ОЧЕНЬ ДОЛГО
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333373
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пробовал IIF вместо NZ. Функции в запросах - штука о-о-оч-ч-ч-чень тормозная.
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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