Announcement

Collapse
No announcement yet.

Join, kreuz & quer.. geht das?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Join, kreuz & quer.. geht das?

    Sodele, ich beisse mir an folgenden Problem die Zähne aus:

    Auf unserem SQL-Server laufen 2 Datenbanken. 1 mit den Konfigurationen (Ich benenne diese in Zukunft mit "DB1"), die andere mit den Messdaten (DB2). Eine Tabelle in der DB1 enthält die Infos aller Messdatentabellen in der DB2, also:

    <PRE>
    DB1, Tabelle "files"

    id titel station Blabla
    *******************************************

    1 Temperatur XY1 Blabla
    2 Druck XY1 Blabla
    3 Temperatur XY2 Blabla
    . . . .
    n Temperatur XY4 Blabla

    </PRE>

    In der DB2 sind nun die jeweilgen Messwerte abgelegt. Für jede ID wird nun eine eigene Tabelle erstellt. Der Titel der Tabelle ist = 'T'+id aus der oben aufgezeichneten Tabelle..

    Wenn ich jetzt zB den Temperaturverlauf von Station XY2 ansehen möchte, sieht das so aus:

    <PRE>
    DB2, Tabelle "T3"

    dt temp
    ********************************

    01.01.04 00:00 30
    01.01.04 00:05 35
    01.01.04 00:10 38
    01.01.04 00:15 37
    . .
    . .
    </PRE>

    Kann ich nun die Tabellen Kreuz&Quer verknüpfen, um Auswertungen mit <b>einer einzigen Abrage</b> zu erhalten?

    z.B den Maximalwert pro File?

    Also so à la:
    <PRE>
    USE DB1

    SELECT f.titel, f.station,
    (SELECT max(temp)
    from 'SERVER.DB2.dbo.T'+str(f.id)) as Maximalwert
    FROM files AS f

    GO

    </PRE>

    Diese Funktion funktioniert (natürlich) nicht.. Gibts da eine Variante das so irgendwe hinzukriegen? Natürlich gänge es über eine For-Each Funktion in der Applikation, aber das ist Performacemässig nicht so dolle..

    Cheers, Mike

  • #2
    Hallo,

    beim MS SQL Server ist das datenbankübergreifende Abfragen von Daten kein Problem. Das folgende Beispiel demonstriert dies:
    <pre>
    USE tempdb
    <b>GO</b>
    <br>
    <b>CREATE</b> <b>TABLE</b> RegionExt
    (
    RegionID <b>INTEGER</b>,
    <b>Value</b> <b>VARCHAR</b>(9)
    )
    <b>GO</b>
    <b>INSERT</b> <b>INTO</b> RegionExt (RegionID,<b>Value</b>) <b>VALUES</b> (1,<font color="#9933CC">'Zusatz 1'</font>)
    <b>INSERT</b> <b>INTO</b> RegionExt (RegionID,<b>Value</b>) <b>VALUES</b> (2,<font color="#9933CC">'Zusatz 2'</font>)
    <b>INSERT</b> <b>INTO</b> RegionExt (RegionID,<b>Value</b>) <b>VALUES</b> (3,<font color="#9933CC">'Zusatz 3'</font>)
    <b>INSERT</b> <b>INTO</b> RegionExt (RegionID,<b>Value</b>) <b>VALUES</b> (4,<font color="#9933CC">'Zusatz 4'</font>)
    <b>GO</b>
    <br>
    USE Northwind
    <b>GO</b>
    <br>
    <b>SELECT</b>
    n.*, (<b>SELECT</b> e.<b>Value</b> <b>FROM</b> tempdb.dbo.RegionExt e <b>WHERE</b> e.RegionID = n.RegionID)
    <b>FROM</b>
    Northwind.dbo.Region n
    </pre>
    Falls die Datenbanken sogar auf verschiedenen Servern liegen, steigt der Aufwand nur unwesentlich an.

    Allerdings muss der Tabellenname vor dem Starten der SELECT-Abfrage dann schon feststehen. Über EXEC könnte man zwar zum Beispiel in der Stored Procedure die tatsächlich auszuführende SQL-Anweisung dynamisch in einer VARCHAR-Variblen generieren lassen, aber das o.g. Problem lässt sich damit allein auch nicht lösen. Erst die Kombination von Stored Procedure + CURSOR + EXEC würde die Aufgabe erfüllen, wobei die Schleife dann nur auf dem SQL Server läuft

    Comment


    • #3
      Hi Andreas.

      Danke bereits für deine Hilfe. Diese Art der Verknüpfung habe ich hingekriegt, lediglich bei den "dynamischen" Tabellennamen happerts gewaltig..

      Na dann, lassen wir das halt eben bleiben.. ;

      Comment


      • #4
        Hallo Michael,<BR><BR>warum benutzt du eigentlich für jede ID eine eigene Tabelle? Wenn ich es richtig verstehe, dann ist die Struktur von DB2 für jede ID in DB1 mit Titel "Temperatur" doch z.B. gleich. Wenn du also in DB2 noch ein Feld "ID" mit der Referenz auf DB1.ID einfügst, dann hast du es mit deinen Abfragen um einiges leichter. Auch wenn es dann vielleicht einige Millionen Datensätze in einer Tabelle gibt, das macht sich mit dem richtigen Index in der Leistung nicht negativ bemerkbar! Damit hast du dann den Vorteil, dass du nur noch abhängig von dem Feld "Titel" in DB1 die richtige Tabelle auswählen musst.<BR><BR>Viel Erfolg, Ola

        Comment


        • #5
          Hi Olaf

          Das von mir aufgezeigte Beispiel war nur eine vereinfachung der wirklichen DB-Struktur. Der Titel der Datensätze (Variabeln) ist ebenfalls in der Konfig-DB hinterlegt. Dazu kommt das der Speicherintervall komplett unterschiedlich ist.

          Comment

          Working...
          X