Count(distinct)

Шыфл
Дата: 17.12.2015 16:54:26
Наткнулся на код, который убивае. Нужно его переписать, а мозг отказывается сотрудничать.

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 проблему не решает
Akina
Дата: 17.12.2015 19:05:55
Сделайте нормальный запрос, а не DCount().
Шыфл
Дата: 17.12.2015 19:12:56
Akina,

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

ничем не отличается от
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+ записях задержка около секунды... (раньше было около минуты)
__Michelle
Дата: 17.12.2015 19:59:23
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
Дата: 17.12.2015 21:33:51
Шыфл
не поверишь, но
[skipped]
ничем не отличается от
[skipped]

Не поверю. Второе прекрасно переписывается в форму без подзапроса. И при наличии индексов взлетает. А первое обречено хромать.
Шыфл
Дата: 18.12.2015 12:23:53
__Michelle
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 задваивает записи, а первичного ключа нет...
__Michelle
Дата: 18.12.2015 12:41:17
Шыфл
Неа, так записи дублируются, потому что в таблице нет первичного ключа....
Вы пробовали? Или просто предполагаете?
У меня не задваиваются, проверила.
Шыфл
Дата: 18.12.2015 13:01:13
__Michelle, ну посчитайте, сколько получается?

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
__Michelle
Дата: 18.12.2015 14:14:28
Шыфл,

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

Ведь, если правильно понимаю, нужно получить общее количество записей с теми rvd_number,
хотя бы для одного из которых checked=true.
Да?
Шыфл
Дата: 18.12.2015 14:27:17
__Michelle,

да, так и надо посчитать, всё строчки, rvd_number у которых хотя бы хотя бы для одного checked=true.