Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Коррелированные запросы. / 9 сообщений из 9, страница 1 из 1
25.03.2011, 12:58
    #37182441
UberKAKTUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
Требуется выбрать количество обратившихся (count(*) as countVisits) и количество оказанных услуг (count(*) as countServices) в разрезе диагнозов (Diagnosis.diagKey).
Таблицы VisitCards (карта обратившегося пациента), Diagnosis (диагнозы) и Services (услуги) имеют поле для связи cardId.
После выполнения нижеприведенного запроса поле countServices (количество оказанных услуг) содержит сумму услуг оказанных только последней обработанной запросом карте.
Считать в несколько запросов считаю крайне неправославной затеей.
В принципе запрос справедлив также для ветки МС СКЛ, куда и планирую обратиться в случае нерезультативности текущей темы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT ;
		Diagnosis.diagKey, count(*) as countVisits, ;
		(SELECT ;
				count(*) as countServices ;
			FROM ;
				Services ;
			WHERE ;
				Diagnosis.cardId == Services.cardId) ;
	FROM ;
		Diagnosis, VisitCards ;
	WHERE ;
		Between(VisitCards.dt_end, DTBEG, DTEND) ;
		AND Diagnosis.cardId == VisitCards.cardId ;
		AND Diagnosis.Main = .t. ;
	INTO ;
		CURSOR ServisecViaDiagnosis ;
	GROUP BY  1 
...
Рейтинг: 0 / 0
25.03.2011, 13:18
    #37182477
UberKAKTUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
Проблема решена вызовом sum() с третим полем в параметре. Я удаляюсь.
...
Рейтинг: 0 / 0
25.03.2011, 13:22
    #37182485
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
UberKAKTUSСчитать в несколько запросов считаю крайне неправославной затеей.
В некоторых случаях MS-SQL в разы быстрее выполняет несколько запросов с сохранением промежуточного результата во временную таблицу, чем один мега-запрос с подзапросами.
...
Рейтинг: 0 / 0
25.03.2011, 13:31
    #37182505
UberKAKTUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
Dima TUberKAKTUSСчитать в несколько запросов считаю крайне неправославной затеей.
В некоторых случаях MS-SQL в разы быстрее выполняет несколько запросов с сохранением промежуточного результата во временную таблицу, чем один мега-запрос с подзапросами.Сказанное Вами вполне закономерно, однако кучка простых запросов мое самолюбие ни сколь не тешат.
...
Рейтинг: 0 / 0
26.03.2011, 19:27
    #37183910
PP762
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
автор Сказанное Вами вполне закономерно, однако кучка простых запросов мое самолюбие ни сколь не тешат.

Вот по этому ты не получаешь 300 тысячь.
...
Рейтинг: 0 / 0
26.03.2011, 20:38
    #37183983
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
Вообще на MS SQL это можно сделать так.
Входные данные
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with Diagnosis as
(select  1  diagKey,  10  cardid union all
 select  2  diagKey,  20  cardid union all
 select  3  diagKey,  30  cardid union all
 select  2  diagKey,  40  cardid
),
VisitCards as
(select  10  cardid union all
 select  20  cardid union all
 select  30  cardid union all
 select  40  cardid 
),
Services as
(select  1  service,  10  cardid union all
 select  1  service,  10  cardid union all
 select  1  service,  10  cardid union all
 select  2  service,  20  cardid union all
 select  2  service,  20  cardid union all
 select  1  service,  30  cardid union all
 select  1  service,  40  cardid 
)

Запрос
Код: plaintext
1.
2.
3.
4.
select d.diagKey, count(distinct v.cardid) countVisits, count(*) countServices
from       Diagnosis  d
inner join VisitCards v on d.cardid = v.cardid
left  join Services   s on d.cardid = s.cardid
group by d.diagKey;
...
Рейтинг: 0 / 0
26.03.2011, 20:43
    #37183988
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
Поправка
Запрос
Код: plaintext
1.
2.
3.
4.
select d.diagKey, count(distinct v.cardid) countVisits, count(s.cardid) countServices
from       Diagnosis  d
inner join VisitCards v on d.cardid = v.cardid
left  join Services   s on d.cardid = s.cardid
group by d.diagKey;
...
Рейтинг: 0 / 0
28.03.2011, 11:21
    #37185361
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
AmKad

Подобные запросы работают только в том случае, если связь один-ко-многим есть только для одной таблицы из всех таблиц-источников. А все прочие таблицы связаны как один-к-одному. Как только, например, на одну карту окажется несколько диагнозов (на что намекает условие Diagnosis.Main = .t.), то подобные запросы начнут выдавать не корректные результаты.

В общем случае, предварительно, необходимо свести все данные к связям вида один-к-одному и только после этого выполнять объединение. А подобного можно добиться либо предварительными выборками в промежуточные хранилища (курсоры), либо подзапросами.
...
Рейтинг: 0 / 0
28.03.2011, 11:36
    #37185393
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коррелированные запросы.
ВладимирМ AmKad

(на что намекает условие Diagnosis.Main = .t.)
Ну так ведь никто не мешает автору самостоятельно внести нужные условия.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Коррелированные запросы. / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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