Zapytania do bazy faktów
Wstęp:
System został wyposażony w mechanizm pozwalający na łatwo tworzenie zapytań do bazy faktów w języku zbliżonych do języka SQL.
Zapytanie jest konwertowane przez system do czystego języka SQL i następnie wykonywane na bazie.
Struktura zapytania jest zbliżona do polecenia SELECT języka SQL. Wprowadzono jednak następujące ułatwienia:
1. Dostęp do faktów uzyskuje się poprzez zapis:
#Nazwa_kategorii(alias)
gdzie:
Nazwa_kategorii oznacza kategorię faktu identyfikowana jako jej nazwa
alias oznacza alias do faktu, poprzez który należy się odwoływać do faktu w dalszej części zapytania.
Opisane odwołanie do faktu może się znajdować w dowolnym miejscu zapyyania, jednak powiąznie to dla jednego aliasu powinno wystąpić tylko raz.
2. Dostęp do atrybutów uzyskuje się poprzez konstrukcję:
Fakt@nazwa_atrybutu
gdzie:
Fakt oznacza odwołanie do faktu opsane w pkt. 1 - czyli alias, lub pełną definicję faktu.
Nazwa_atrybutu - oznacza pełna nazwę atrybutu. Jeśli nazwa zawiera nietypowe znaki, wówczas nazwę można zawszeż w znakach cudzysłowu (").
3. Jeśli fakty zostana zdefiniowane np. na liście pól po słowie SELECT wówczas dopuszczalne jest pominięcie sekcji FROM zapytania.
4. Relacje między faktami można określic w sposób jawny, lub niejawny.
Jawne wskazanie polega na wpisaniu w sekcji WHERE poleceń:
Fakt1 is_part_of Fakt2 lub
Fakt2 is_atribut_of Fakt2
Wpis ten spowoduje dodanie warunków określających wprost powiązanie między podanymi instancjami faktów.
Zamiast podawać definicję wprost, mozna sie posłużyć klauzulą AutoRel która wprowadzi automatycznie odpowiednie relację między instancjami na podstawie definicji powiazań między kategoriami.
5. Jeśli analizujemy kilka faktów, w celu uzyskania sensownych wyników zwykle należy dodać warunki opisujące, czy fakty maja dotyczyć tego samego pacjenta, czy pobytu, badania, czy usługi. W celu automatyzacji tego procesu dodano odpowidnio klauzule:
SamePat
- gdy dotyczą tego samego pacjenta
SameHosp
- gdy dotyczą tego samego pobytu
SameExam -
gdy dotyczą tego samego badania
SameService
- gdy dotyczą tej samej usługi
6. Należy pamiętać, że poza opisanymi uwagami, tworzone zapytanie jest normalnym zapytaniem SQL, więc w jego ramach można dokonywać powiązań z innymi tabelami. Przykładowe zapytania:
Załóżmy, że zdefiniowano 3 kategorie RR, SYST i DISAT zonaczające ciśnienie (RR) z atrybutem czas_pomiaru oraz wartości ciśnenia skurczowego (SYST) oraz rozkurczowego DIAST z atrybutami Wartosc każdy. Kategorie SYST i DIAST są w relacji Part_of w stosunku do RR.
select
#rr(r)@czas_pomiaru,
#diast(d)@wartosc
where
r.czas_utworzenia >
'20000101'
and
SamePat
and d is_part_of r
order by r@czas_pomiaru
Powyższe zapytanie zwraca czas pomiaru oraz wartość ciśnienia rozkurczowego pacjenta dla wpisów do bazy faktów dokonanych po 1.1.2000.
select
#rr(r)@czas_pomiaru,
#diast(d)@wartosc
where
r.czas_utworzenia >
'20000101'
and SamePat
and
AutoRel
order by r@czas_pomiaru
Zapytanie analogiczne, ale automatycznie tworzy powiązania relacji.
select
#rr(r)@czas_pomiaru,
#diast(d)@wartosc,
#syst(s)@wartosc
where
r.czas_utworzenia > '20000101'
and
SamePat
and
AutoRel
order by r@czas_pomiaru
Zapytanie analogiczne, ale dodatkwo odpytuje również od ciśnienie rozkurczowe.
select
ew.nazwisko,
ew.imie,
#rr(r)@czas_pomiaru,
#diast(d)@wartosc,
#syst(s)@wartosc
from
ewidencja
ew
where
r.czas_utworzenia >
'20000101'
and SamePat
and AutoRel
and r.idx_osoby =
ew.idx_osoby
order by r@czas_pomiaru
Przykład równoczesnego stosowania danych z bazy faktów i innych tabel - swracam uwagę na sposób wiązania.
select
ew.nazwisko,
ew.imie,
r@czas_pomiaru,
d@wartosc,
s@wartosc
from
ewidencja
ew,
#rr(r),
#diast(d),
#syst(s)
where
r.czas_utworzenia >
'20000101'
and SamePat
and AutoRel
and r.idx_osoby = ew.idx_osoby
order
by r@czas_pomiaru
To samo, ale z jawnym definiowaniem faktów w sekcji FROM.