Задавайте вопросы, мы ответим
Вы не зашли.
Утро доброе!
Имеется 3 таблицы:
1) VMU_PRVS
-ID_PRVS
-PRVS_NAME
2) CASE_SERVICES
-ID_SERVICE
-ID_PRVS
3) REFUSES_OBJ
-ID_SERVICE
Нужно: составить запрос на выборку, результатом которой будет являться:
VMU_PRVS.PRVS_NAME, count(CASE_SERVICES.ID_SERVICE), count(REFUSES_OBJ.ID_SERVICE).
Совсем не могу разобраться, т.к. выполнить это нужно именно в одном запросе, а с join'ами я в конец запутался (выводится одинаковые результаты подсчета для 2х столбцов).
Прошу вас помочь разобраться в этом запросе, сам уже 2й день ломаю голову
Неактивен
Используйте подзапросы?
Неактивен
К сожалению этой техникой я не владею
Как это?
Неактивен
SELECT PRVS_NAME, (SELECT COUNT(*) FROM CASE_SERVICES c WHERE c.ID_PRVS = v.ID_PRVS) CASE_SERVICES, …
FROM VMU_PRVS v;
Неактивен
Спасибо!
То есть так? :
SELECT v.PRVS_NAME, (SELECT COUNT(*) FROM CASE_SERVICES c
WHERE c.ID_PRVS = v.ID_PRVS) AS CASE_S, (SELECT COUNT(*) FROM REFUSES_OBJ r, CASE_SERVICES c WHERE r.ID_SERVICE=c.ID_SERVICE) AS REFUSES_O
FROM VMU_PRVS AS v;
Похоже, но к сожалению результат не тот...
Каждой записи vmu_prvs.prvs_name должно соответствовать количество записей, которые числятся за данным значением в таблице case_service, и количество записей, совпадающие с значением из refuses_obj...
для наглядности заполнил таблицы данными:
1)vmu_prvs
id_prvs|prvs_name
1 | aaa
2 | bbb
3 | ccc
2)case_services
id_service|id_prvs
a | 1
b | 2
c | 2
d | 3
e | 1
f | 1
3)refuses_obj
id_service
a
c
f
Результатом выполнения указанного выше запроса было:
prvs_name|case_s|refuses_o
aaa | 3 | 3
bbb | 2 | 3
ccc | 1 | 3
А должно быть:
prvs_name|case_s|refuses_o
aaa | 3 | 2
bbb | 2 | 1
ccc | 1 | 0
Неактивен
Считайте COUNT (DISTINCT id_service) во втором случае?
Неактивен
SELECT v.PRVS_NAME, (SELECT COUNT(*) FROM CASE_SERVICES c
WHERE c.ID_PRVS = v.ID_PRVS) AS CASE_S,
(SELECT COUNT(DISTINCT r.id_service) FROM REFUSES_OBJ r,
CASE_SERVICES c WHERE r.ID_SERVICE=c.ID_SERVICE) AS REFUSES_O
FROM VMU_PRVS v;
Результат не изменился
Неактивен
Брр. Вы хотите, чтобы я забил данные, и написал запрос за Вас, да? А где же
тогда эффект обучения?
[celestia] root test > select prvs_name, count(id_service), count(r.id_service) from vmu_prvs join case_services using (id_prvs) left join refuses_obj r using (id_service) group by 1; +-----------+-------------------+---------------------+ | prvs_name | count(id_service) | count(r.id_service) | +-----------+-------------------+---------------------+ | aaa | 3 | 2 | | bbb | 2 | 1 | | ccc | 1 | 0 | +-----------+-------------------+---------------------+ 3 rows in set (0.00 sec)
Неактивен
Спасибо огромное!
Эффект обучения сохраняется, просто было не совсем понятно как реализовать подобный запрос.
А без Вашей помощи я бы неизвестно что натворил еще...меня уже понесло в "create view as" и подобные степи
Спасибо.
Неактивен
Если можно, еще вопрос...
Помогите с таким запросом:
есть 3 таблицы
1)patient_data
id_patient|name
1 | Иванов
2 | Петров
3 | Сидоров
2)case_services
id_service|Date_begin
a | 1.01.1990
b | 2.02.1990
c | 3.02.1990
d | 3.03.1990
e | 4.03.1990
f | 5.03.1990
3)refuses_obj
id_service|id_patient|refuse_date
a | 1 | 01.01.1990
c | 2 | 04.02.1990
f | 2 | 06.03.1990
Нужно выбрать Patient_data.Name, case_services.date, refuses_obj.date_R. С условием, что refuses_obj.date_R > 02.02.1990 и < 06.03.1990
Соответственно результат:
Name |case_date |ref_d
Петров |03.02.1990 |04.02.1990
Выполняю такой запрос:
select p.name, r.Refuse_date, c.date_begin
from refuses_obj r
inner join patient_data p on (p.id_patient=r.id_patient)
inner join case_services c on (c.id_service=r.id_service)
where r.refuse_date="01.09.2010"
В ответ все поля null.
Где ошибка, и как сделать такой запрос без Using, как в предыдущем случае?
Неактивен
where r.refuse_date="01.09.2010"
Таких дат у Вас нету. Вроде бы, в условии было BETWEEN?
Неактивен
Да, забыл отписаться- покопался в документациях и исправил свою недароботку в использовании дат. Спасибо!
Только вот столкнулся с другой проблемой...в первом запросе...
При запуске его на другом сервере, на котором установлен старенький Firebird 1.5, появляется ошибка на отсутствие в синтаксе такого хорошего и полезного слова using
Как эксперт в этой области можете посоветовать что-то, но без обновления версии сервера БД?
Неактивен
1. Firebird ≠ MySQL. Если хотите переносимости, используйте только ANSI SQL.
2. FROM a JOIN b USING (field) эквивалентно FROM a JOIN b ON a.field = b.field.
Неактивен
Спасибо за справку. Теперь переношу запрос на firebird. Хотя в обновленной версии обещали изменения, и некоторые пользователи говорят, что в синтаксисе появился using...однако у меня все равно не получилось.
Но зато попрактикуюсь в join'ах
Отредактированно corn1 (27.09.2010 23:52:09)
Неактивен