Virtabs: Mehrfachzugriff auf Basistabellen

Unterabfragen und mehrfache Tabelleninstanzen (QUERY, ALIAS)

Unter Umständen stellt sich bei der Konzeption einer Virtab das Problem, dass eine beteiligte Tabelle mehrfach von verschiedenen anderen Tabellen referenziert wird. Solch eine Tabelle liefert mehrere Records, wobei gleiche Felder verschiedneer Records unter je naderem Namen in der Virtab veröffentlicht sind.
Zur Illustration ist das Beispiel 7, Virtab letter_data heranzuziehen, in dem sowohl DEPARTMENTS als auch CUSTOMER auf ADDRESS verweisen, es also pro Virtab-Datensatz zwei Fremdschlüsselreferenzen auf ADDRESS. Somit müssen pro Virtab-Operation zwei aktuelle Zeilen in der Tabelle ADDRESS verwaltet werden  (zwei "Queries" bzw. Teilabfragen). Die verschiedenen Queries werden durch Bezeichner (hier: 'q_customer' und 'q_employee') voneinander unterschieden. Tabellen, für die keine Query angegeben ist, werden einer Default-Query 'A' zugeordnet.

Die Definitionsdatei für diese Situation sieht so aus:

 

VIRTUALTABLE letter_data
/* ein CUSTOMER und sein ADDRESS
     werden als Query Q_CUSTOMER angesprochen,
   ein EMPLOYEE, sein DEPARTMENT und ADDRESS des Departments
     werden als Query Q_EMPLOYEE angesprochen
   Query Q_MAIN buendelt Q_CUSTOMER und Q_EMPLOYEE */

TABLE address    QUERY q_customer ALIAS cust_address
TABLE customer   QUERY q_customer, q_main
TABLE address    QUERY q_employee ALIAS emp_address  NOCHANGE
TABLE department QUERY q_employee    NOCHANGE
TABLE location   QUERY q_employee    NOCHANGE
TABLE employee   QUERY q_employee, q_main
   FOREIGNKEY customer.salesperson_id NOCHANGE

// Spalten der Q_CUSTOMER-Query
COLUMN cust_name     = customer.name
COLUMN cust_street   = cust_address.street
COLUMN cust_city     = cust_address.city
COLUMN cust_state    = cust_address.state
COLUMN cust_zip_code = cust_address.zip_code

// Spalten der Q_EMPLOYEE-Query
COLUMN emp_first_name = employee.first_name
COLUMN emp_last_name = employee.last_name
COLUMN emp_street    = emp_address.street
COLUMN emp_city      = emp_address.city
COLUMN emp_state     = emp_address.state
COLUMN emp_zip_code  = emp_address.zip_code
COLUMN emp_department = department.name
COLUMN emp_loc       = location.regional_group

 

In diesem Beispiel wird ADDRESS einerseits unter dem Alias “cust_address” mit CUSTOMER verknüpft (Query “q_customer”), andererseits unter dem Alias “emp_address” mit DEPARTMENT (Query “q_employee”). Diese beiden Queries haben zunächst untereinander noch keinen gemeinsamen Berührungspunkt. Beide Teilabfragen werden daher durch die Query “q_main” miteinander verknüpft. Über die FOREIGNKEY-Anweisung wird die zu benutzende Verknüpfungsstruktur spezifiziert, da es zwei mögliche Fremdschlüsselverweise auf EMPLOYEE gibt (employee.manager_id und customer .salesperson_id).

Datensätze in Query “Q_Employee”

Datensätze in Query “Q_Customer”

Mehrfachzugriffe auf eine Tabelle innerhalb einer Abfrage führt ER2SQL so durch, als gäbe es die entsprechende Tabelle mehrfach, nämlich einmal pro Query. Dabei werden die verschiedenen Queries durch Bezeichner voneinander unterschieden. Es werden mehrere Pseudonyme mit den Namen <table>_<nr> (also z.B. ADDRESS_1) für die entsprechende Tabelle angelegt und zwar in Form von Views (CREATE VIEW address_1 AS SELECT * FROM address). Alle diese Pseudonyme sprechen aber dieselbe Datenbank-Tabelle an.

Innerhalb der Virtab-Definition werden die verschiedenen Pseudonyme über den Alias-Namen unterschieden und angesprochen. Fehlt die Alias-Definition, wird der Name der Datenbanktabelle dafür angenommen.

Die verschiedenen Unterabfragen in einer Virtab werden dadurch miteinander verknüpft, dass immer mindestens eine Tabelle zu mehreren Queries gehört. Diese Tabelle(n) kann/können nur einen aktuellen Datensatz pro Virtab-Record haben. Dieser muss für alle beteiligten Queries der gleiche sein. Im Beispiel muss z.B. EMPLOYEE zu den Queries “q_employee” und “q_main” gehören, und CUSTOMER zu den Queries “q_customer” und “q_main”, um alle Unterabfragen der Virtab zusammenzuführen.

Datensätze in Query “Q_Main”

Um einen (Gesamt-)Virtab-Record zu bilden, muss zunächst in jeder beteiligten Tabellen -Instanz ein Teil-Record lokalisiert werden (hier also 4 aus 3 physikalischen Tabellen). Innerhalb der Teil-Queries läuft das Raussuchen über die beschriebenen Mechanismen. Untereinander sind die Teil-Queries dann noch zu 'synchronisieren'. Dies geschieht über die Ermittlung identischer Inhalte von Spalten der gleichen Tabelleninstanzen, die als Schnittmenge jeweils in den Teil-Queries vorkommen (hier: EMPLOYEE und CUSTOMER).

 

Datensätze in der Virtab “VT_Letter_Data”:

Im Diagramm ist folgendes dargestellt:

  • Ein einzelner Record aus Tabelle EMPLOYEE  kommt in den Queries Q_Employee (blau) und Q_Main (grün) vor und synchronisiert so Q_Employee und Q_Main.
  • Ein einzelner Record aus Tabelle CUSTOMER  kommt in den Queries  Q_Main (grün) und Q_Customer (rot) vor und synchronisiert so Q_Main und Q_Customer.
  • Auf Tabelle ADDRESS wird zweimal zugegriffen.
    Ein Record stammt aus dem Table-Alias “emp_address”  = “Table ADDRESS, Query Q_Emp” (blaue Query),
    ein weitere Record kommt aus Table-Alias “custaddress” = “Table ADDRESS, Query Q_Customer” (rote Query).

 

[Konzepte] [Virtab-Prozeduren] [LINK, FOREIGNKEY] [QUERY: Mehrfachzugriffe] [USES und Verschmelzen] [Schreibschutz, -zwang] [Daten-Teilmengen] [Synthetische Spalten] [User-SQL]