Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Count(distinct) / 15 сообщений из 15, страница 1 из 1
17.12.2015, 16:54
    #39131042
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Наткнулся на код, который убивае. Нужно его переписать, а мозг отказывается сотрудничать.

Код: vbnet
1.
2.
selected = DCount("*", "TA_S_RVB_read_vouchers_box", "checked = true")
All = DCount("*", "TA_S_RVB_read_vouchers_box", "rvb_number in (select distinct rvb_number from TA_S_RVB_read_vouchers_box where checked = true)")


Второй запрос мегатормозной, очевидно из-за in.
Я понимаю, что это хрень, но как её переписать то корректно? Убирание distinct проблему не решает
...
Рейтинг: 0 / 0
17.12.2015, 19:05
    #39131214
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Сделайте нормальный запрос, а не DCount().
...
Рейтинг: 0 / 0
17.12.2015, 19:12
    #39131221
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Akina,

не поверишь, но
Код: vbnet
1.
DCount("*", "TA_S_RVB_read_vouchers_box", "rvb_number in (select distinct rvb_number from TA_S_RVB_read_vouchers_box where checked = true)")


ничем не отличается от
Код: sql
1.
select count(*) from TA_S_RVB_read_vouchers_box where rvb_number in (select distinct rvb_number from TA_S_RVB_read_vouchers_box where checked = true)



Что-то я так и не понял, как это можно нормально переписать по другому... Добавил индекс на rvb_number, помогло, конечно, но не летает. На 70000+ записях задержка около секунды... (раньше было около минуты)
...
Рейтинг: 0 / 0
17.12.2015, 19:59
    #39131263
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Код: sql
1.
2.
3.
4.
5.
6.
SELECT Count(*)
FROM 
(SELECT T1.*
FROM TA_S_RVB_read_vouchers_box AS T1 INNER JOIN TA_S_RVB_read_vouchers_box AS T2 
ON T1.rvb_number=T2.rvb_number
WHERE T2.checked) AS Z;
...
Рейтинг: 0 / 0
17.12.2015, 21:33
    #39131326
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Шыфлне поверишь, но
[skipped]
ничем не отличается от
[skipped]
Не поверю. Второе прекрасно переписывается в форму без подзапроса. И при наличии индексов взлетает. А первое обречено хромать.
...
Рейтинг: 0 / 0
18.12.2015, 12:23
    #39131699
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
__Michelle
Код: sql
1.
2.
3.
4.
5.
6.
SELECT Count(*)
FROM 
(SELECT T1.*
FROM TA_S_RVB_read_vouchers_box AS T1 INNER JOIN TA_S_RVB_read_vouchers_box AS T2 
ON T1.rvb_number=T2.rvb_number
WHERE T2.checked) AS Z;



Неа, так записи дублируются, потому что в таблице нет первичного ключа (не спрашивайте почему)

AkinaНе поверю. Второе прекрасно переписывается в форму без подзапроса. И при наличии индексов взлетает. А первое обречено хромать.

Вот как это, прекрасно? Join задваивает записи, а первичного ключа нет...
...
Рейтинг: 0 / 0
18.12.2015, 12:41
    #39131724
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Шыфл Неа, так записи дублируются, потому что в таблице нет первичного ключа....Вы пробовали? Или просто предполагаете?
У меня не задваиваются, проверила.
...
Рейтинг: 0 / 0
18.12.2015, 13:01
    #39131743
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
__Michelle, ну посчитайте, сколько получается?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
rvb_number	checked	vrf_send_date
RVB0000257355       	0	22. 6. 2015
RVB0000257356       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	-1	22. 6. 2015
RVB0000257357       	-1	22. 6. 2015
RVB0000257357       	-1	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257357       	0	22. 6. 2015
RVB0000257361       	-1	22. 6. 2015
RVB0000257361       	-1	22. 6. 2015
RVB0000257361       	-1	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
RVB0000257361       	0	22. 6. 2015
...
Рейтинг: 0 / 0
18.12.2015, 14:14
    #39131864
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Шыфл,

Что именно посчитать?
Я даже не знаю, это исходная таблица или результат выполнения запроса
(рассматривать пристально rvd_number в поисках одинаковых как-то не очень, так уж точно ошибусь).

Ведь, если правильно понимаю, нужно получить общее количество записей с теми rvd_number,
хотя бы для одного из которых checked=true.
Да?
...
Рейтинг: 0 / 0
18.12.2015, 14:27
    #39131877
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
__Michelle,

да, так и надо посчитать, всё строчки, rvd_number у которых хотя бы хотя бы для одного checked=true.
...
Рейтинг: 0 / 0
18.12.2015, 14:34
    #39131884
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Шыфл,

Мне кажется, мой запрос делает именно это.
Разве нет?
...
Рейтинг: 0 / 0
18.12.2015, 14:52
    #39131906
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
__MichelleШыфл,

Мне кажется, мой запрос делает именно это.
Разве нет?

Ну так возьмите тестовые данные, и посмотрите, что ваш запрос выдаст 90, а мой - 30... Почему это, интересно?
...
Рейтинг: 0 / 0
19.12.2015, 13:33
    #39132313
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
Да, действительно, результат не тот .
Хотя и не 90.
Вот поправленный запрос
Код: sql
1.
2.
3.
4.
SELECT Count(*) FROM 
(SELECT T1.*
FROM TA_S_RVB_read_vouchers_box AS T1 INNER JOIN 
(SELECT DISTINCT rvb_number FROM TA_S_RVB_read_vouchers_box WHERE checked) AS T2 ON T1.rvb_number = T2.rvb_number) AS Z

Результат 30.
...
Рейтинг: 0 / 0
21.12.2015, 16:43
    #39133453
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
__Michelle,

спасибо, работает намного быстрее, чем оригинальный вариант. Хотя я так и не понял, зачем там Z. Использую вариант
Код: sql
1.
2.
3.
4.
SELECT count(*) 
FROM TA_S_RVB_read_vouchers_box AS T1 
INNER JOIN (SELECT DISTINCT rvb_number FROM TA_S_RVB_read_vouchers_box WHERE checked) AS T2 
ON T1.rvb_number = T2.rvb_number
...
Рейтинг: 0 / 0
21.12.2015, 18:03
    #39133617
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count(distinct)
ШыфлХотя я так и не понял, зачем там Z.Имя вложенного подзапроса.
Но само выделение этого подзапроса - архитектурное излишество, сделано для понятности.
Можно и без этого.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Count(distinct) / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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