Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе / 25 сообщений из 44, страница 1 из 2
22.11.2003, 00:54
    #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
22.11.2003, 01:11
    #32332031
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
SELECT cash.* as a - это опечатка :)
следует читать как SELECT cash.*
...
Рейтинг: 0 / 0
22.11.2003, 14:20
    #32332123
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
автор писал:Проверял, что там происходит так:
Там - это где?
...
Рейтинг: 0 / 0
22.11.2003, 14:29
    #32332128
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Проверял, что происходит в запросе.
Первый вариант возвращал одно только число - вот я и посмотрел, что "там" со строками происходит
...
Рейтинг: 0 / 0
22.11.2003, 14:34
    #32332132
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Даны два запроса. Первый неправильный, а второй "там". Каким образом второй получен из первого? И откуда известно, что второй правильный?
...
Рейтинг: 0 / 0
22.11.2003, 14:41
    #32332138
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Саныч,первый запрос с Sum, второй почти такой же ,но без суммирования,возвращающий все записи.Умение внятно формулировать свои мысли не относится к главным достоинствам VsevolodV (впрочем как и к моим),
но в данном случае все понятно.
...
Рейтинг: 0 / 0
22.11.2003, 14:42
    #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
22.11.2003, 14:49
    #32332142
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
2 VsevolodV
Скорее всего у тебя в какой то из таблиц есть дубликаты, или джойнишь неправильно
...
Рейтинг: 0 / 0
22.11.2003, 14:53
    #32332144
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
ID_OPER - ключевое поле
Пробовал INNER JOIN, LEFT JOIN и RIGHT JOIN - результат не изменялся
...
Рейтинг: 0 / 0
22.11.2003, 15:02
    #32332149
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Ну и где в твоих запросах используется ID_OPER ?
...
Рейтинг: 0 / 0
22.11.2003, 15:06
    #32332151
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Так его вроде и не нужно использовать - таблицы связываются по полю [Реф №]
...
Рейтинг: 0 / 0
22.11.2003, 15:25
    #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
22.11.2003, 15:49
    #32332161
(c)VIG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Vsevolod,читай мой пост от 14:49
У тебя 3 строкам из Calc соответствуют 2 строки из Cash.В результате соединения ты получишь (и получаешь) 6 строк результирующего набора.
И объясни мне, зачем хранить в таблицах дубликаты?
...
Рейтинг: 0 / 0
23.11.2003, 18:00
    #32332415
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Что значит дубликат?
Если имеется ввиду, что одна запись записана два раза, то такого нет.
...
Рейтинг: 0 / 0
23.11.2003, 19:16
    #32332434
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Помогите разобраться. По-моему, сам запрос "в корне" составлен неправильно.
Нужно вот что: Если в строках с определенным [Реф №] таблицы Calc есть хотя бы одна строка, в которой статус = "Получено", то по этому [Реф №] нужно посчитать sum(cash.эквивалент1) из таблицы Cash соответственно.
...
Рейтинг: 0 / 0
23.11.2003, 19:28
    #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
23.11.2003, 19:58
    #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
24.11.2003, 16:05
    #32333224
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
В зависимости от условия WHERE запрос может выполняться 5 минут и более :(
Должны же быть какие-нибудь пути оптимизации.
...
Рейтинг: 0 / 0
24.11.2003, 16:26
    #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
24.11.2003, 16:29
    #32333264
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
автор писал:between #14/09/2003# and #20/09/2003#
В селектах даты пишутся по MMDDYYYY! Этому посвящена половина форума.
...
Рейтинг: 0 / 0
24.11.2003, 16:39
    #32333277
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Ой! Забыл :)
Но это не влияет на расчет вышеуказанного поля.
...
Рейтинг: 0 / 0
24.11.2003, 17:05
    #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
24.11.2003, 17:16
    #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
24.11.2003, 17:17
    #32333349
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
Предыдущего поста НЕ БЫЛО :)
Я забыл t.[реф №].
---
работает долго! ОЧЕНЬ ДОЛГО
...
Рейтинг: 0 / 0
24.11.2003, 17:31
    #32333373
Витал
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование данных в запросе
А пробовал IIF вместо NZ. Функции в запросах - штука о-о-оч-ч-ч-чень тормозная.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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