ой, извините, промашечка получилась.stix-s писал(а):данные и структура базы не мои, все взято с форума
Ребята, я запутался, уж и не знаю какие запросы в этом топике сравнивать.
Остановлюсь на
зная только два слова из sql-науки (селект и фром), доложу Вам, что это разные запросы, как по эстетическим соображениям, так и по функциональным. Читаю вслух как могу:Селект без погрешности:
Код:Код: Выделить всё
SELECT COALESCE( SUM( (SELECT COUNT(DISTINCT(CS.CLIENTFK)) FROM CLIENTS2SUBJECTS CS WHERE CS.SUBJECTFK IN ( SELECT SUBJECTID FROM SUBJECTS WHERE COURSEFK=C.COURSEID ) )), 0) FROM COURSES C WHERE (SELECT COUNT(*) FROM SUBJECTS WHERE COURSEFK=C.COURSEID)>0 AND (( 1133384400 BETWEEN C.COURSESTARTDATE AND C.COURSEENDDATE ) OR ( 1136062799 BETWEEN C.COURSESTARTDATE AND C.COURSEENDDATE )) AND DIRDEPARTMENTFK=2
возврашает число 293, а твой
Код:Код: Выделить всё
select COUNT(DISTINCT(CS.CLIENTFK)) from courses c, Subjects s, Clients2Subjects cs where s.coursefk = c.courseid and s.subjectid = cs.subjectfk and (( 1133384400 BETWEEN C.COURSESTARTDATE AND C.COURSEENDDATE ) OR ( 1136062799 BETWEEN C.COURSESTARTDATE AND C.COURSEENDDATE )) and DIRDEPARTMENTFK=2
возрашает 292.
Только чего-то не соображу, почему разница все-таки есть...
в первом случае для _каждой_ строки в COURSES подсчитаем количество уникальных CS.CLIENTFK и просуммируем эти количества вообще для всего запроса;
во втором случае подсчитывается только количество уникальных CS.CLIENTFK для всей выборки.
Они, эти запросы, оба правильные, отличаются только степенью эффективности и самими задачами, которые они решают.
А какую задачу решает зачинатель обсуждения?
Хотя, особо не вникаю, может опять не тому и не на тот вопрос отвечаю. Уж не ругайте.