• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Asymmetrische Notation eines einseitig äußeren Verbunds

Für den letzten Fall des vollständig äußeren Verbunds sei im Folgenden das dazu notwendige XQuery-Anfragemuster am Beispiel aus dem vorangegangenen Abschnitt in zwei Schritten gezeigt, wobei zunächst die asymmetrische Alternative für einen einseitig äußeren Verbund erläutert wird und sich daran die Kombination zu einem vollständig äußeren Verbund anschließt.

Dazu kann die Semantik des einseitigen äußeren Verbunds erhalten bleiben (und dadurch das gleiche Ergebnis erzielt werden), wenn das Ergebnisdokument zunächst alle Patienten mit ihren Notfallärzten auflistet und in einem zweiten Teil alle Patienten ohne Notfallarzt aufgenommen werden. Für den ersten Teil kann im Wesentlichen die symmetrische Schreibweise aus dem vorangegangenen Abschnitt übernommen werden. Für den zweiten Teil ist in der where-Klausel darauf zu achten, dass nur die Einträge übernommen werden, die keine Verbundpartner aufweisen.

 

<Patientenliste>
(: Patienten mit Notfallarzt :)
<PatientenMitArzt>
{
for $p in fn:collection("Patienten")
for $a in fn:doc("Hochwaldklinik.xml")//Arzt
where $p//Adresse/Stadt = $a//Adresse/Stadt
order by $p//Nachname, $p//Vorname
return
<Patient>
{ $p/*/Name }
<Notfallarzt>
{ $a/Name }
{ $a/Adresse }
</Notfallarzt>
</Patient>
}
</PatientenMitArzt>
,
(: Patienten ohne Arzt :)
<PatientenOhneArzt>
{
for $p in fn:collection("Patienten")
where fn:empty(fn:doc("Hochwaldklinik.xml")//Arzt
[.//Adresse/Stadt = $p//Adresse/Stadt]
order by $p//Nachname, $p//Vorname
return
<Patient>
{ $p/*/Name }
</Patient>
}
</PatientenOhneArzt>
</Patientenliste>

Zur Durchführung des Tests wird an dieser Stelle auf die fn:empty()-Funktion zurückgegriffen, die TRUE liefert, wenn die als Parameter übergebene Sequenz kein Element enthält. Als Parameter wird konkret in diesem Beispiel das Ergebnis des Pfadausdrucks übergeben, der die Notfallärzte für den konkreten Patienten zurückliefert.

Zu beachten ist bei diesem Anfragemuster, dass die beiden Elemente PatientenMitArzt und PatientenOhneArzt auf gleicher Stufe stehen und aus Sicht des Wurzelelementes Patientenliste eine Sequenz bilden. Dies impliziert auch die Verwendung eines Kommaoperators zwischen den beiden FLWOR-Ausdrücken.

Soll die durch diese asymmetrische Notation implizierte Zweiteilung des Ergebnisdokumentes eliminiert werden, so ist der komplexe FLWOR-Ausdruck in einen umgebenden FLWOR-Ausdruck einzubetten, der die finale und einheitliche Sortierung übernimmt. Für das laufende Beispiel würde sich folgende XQuery-Anweisung ergeben:

<Patientenliste>
{
for $x in { (: obige XQuery-Anweisung ohne order by-Klauseln :) }
order by $x//Nachname, $x//Vorname
return $x
}
</Patientenliste>

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>