dr.Colossos: Abfrage ueber mehrere DATENBANKEN

Hi,

ist es mit MSSQL (2005) moeglich, mehrere Datenbanken (ja, Datenbanken, nicht Tabellen) in einer Query abzufragen, also sowas in der Art:

SELECT db1.fieldA AS db1_feld_A, db2.fieldA AS db2_feld_A WHERE db1.fieldA = db2.fieldA;

Geht das?

Btw, wie oben geht's nicht, aber geht's irgendwie anders?

Wie siehts mit PGSQL order Oracle aus, weiss das wer?

Danke sehr!

  1. yo,

    ist es mit MSSQL (2005) moeglich, mehrere Datenbanken (ja, Datenbanken, nicht Tabellen) in einer Query abzufragen, also sowas in der Art:

    grundsätzlich ist das möglich, aber dafür ist erst mal der begriff "mehrere datenbanken" zu klären. bei msssql können nämlich verschiedene datenbanken auf einem server liegen. dafür bräuchtest du dann einfach nur die berechtigungen für die jeweilige datenbank und kannst sie entsprechend der namen der datenbanken ansprechen. streng genommen handelt es sich aber nicht wirklich um verschiesene datenbanken auf einem server.

    bei oracle zum beispiel wären das mehrere schemata auf einem server(instanz) und nicht mehrerer datenbanken. der begriff datenbank unter mssql ist also zweideutig. bei oracle kannst du mehrer datenbank (also verschiedene instanzen) mit einem sogenannten "database link" ansprechen, google spuckt dazu eine menge links aus.

    Ilja

    1. Hi,

      danke an alle.

      @Tom: Sorry, habe das "FROM" im obigen Beispiel vergessen, bei meinen Tests natuerlich nicht ...

      @Vinzenz: ... d'oh, ja, so hatte ich es, hab nur das "dbo" vergessen.

      Funktioniert, danke!

  2. Hello,

    ist es mit MSSQL (2005) moeglich, mehrere Datenbanken (ja, Datenbanken, nicht Tabellen) in einer Query abzufragen, also sowas in der Art:

    SELECT db1.fieldA AS db1_feld_A, db2.fieldA AS db2_feld_A WHERE db1.fieldA = db2.fieldA;

    Geht das?

    Btw, wie oben geht's nicht, aber geht's irgendwie anders?

    Was geht nicht?
    Benötigt MSSQL kein from?

    So würde es z.B. bei MySQL aussehen und auch funktionieren, Zugriffsrechte vorausgesetzt

    select testdb.adresse.* from testdb.adresse, testserver.adresse where testdb.adresse.id_adresse = testserver.adresse.id_adresse;

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  3. Hallo

    ist es mit MSSQL (2005) moeglich, mehrere Datenbanken (ja, Datenbanken, nicht Tabellen) in einer Query abzufragen, also sowas in der Art:

    Geht das?

    ja, selbstverständlich, z.B. mit vollständigen Bezeichnern, z.B.

    SELECT
        t1.feld1,
        t2.feld2
    FROM
        db1.dbo.tabelle1 t1 -- die genauen Bezeichnungen entnehme dem SQL-Manager
    INNER JOIN
        db2.dbo.tabelle2 t2
    ON t1.feld3 = t2.feld4

    Kein Problem und im Handbuch genauso beschrieben.

    Freundliche Grüße

    Vinzenz

  4. Hallo,

    MS SQL ...
    1 physikalischer Server (Hardware) mit einem Windows Betriebssystem
      -> n MS SQL Server Instanzen (Server-Installationen), wie z.b. SERVER\Instanz1, SERVER\Instanz2 usw.
        -> 1 Master Datenbank, 1 Model Datenbank, 1 Temp Datenbank, 1 MSDB Datenbank
        -> n Benutzerdatenbanken (imho ist da bei 1024 noch nicht Schluss)

    Eine "Datenbank" ist in diesem Sinne eine "logische Einheit", u.a. gekennzeichnet durch eigene Dateien.

    Objekte unter MS SQL werden mit Teilen des oder mit dem vollen qualifizierten Namen innerhalb einer Instanz angesprochen:

    [Server].[Datenbank].[Owner/Schema].[Objekt]

    Also z.b.

    • voller Name: [MIPFADDEV01].[TradeVision].[Common].[Dim_Date]
    • vom selben Server/Instanz quer über Datenbanken ginge auch
      [TradeVision].[Common].[Dim_Date]
    • innerhalb der DB [TradeVision] geht auch [Common].[Dim_Date]
    • für einen Benutzer gibt es immer ein Default-Schema, dessen Objekte er auch ohne die Angabe des Schema, meistens [dbo], referenzieren kann

    Aus Gründen der Übersicht, sollte aber mindestens immer [Owner/Schema].[Objekt] zur Identifikation benutzt werden.

    Auf Aliase geh ich jetzt nicht ein.

    Für den Zugriff quer über mehrere Server gibt es das Feature "Linked Server", wo man eine andere (entfernte) Instanz von MS SQL oder auch Oracle und diverses andere registrieren kann. Ohne diese Registrierung sind Abfragen über mehrere Server/Instanzen _nicht_ möglich, weil die eigene MS SQL Instanz den ersten Teil [Server] vom voll-qualifizierenden Namen nicht kennt.

    Da von "Zweideutigkeiten" zu sprechen, ist einfach schwachsinnig. Genauso schwachsinnig, als wenn ich mich halbwissend über Oracle auslassen würde. Es ist einfach ein anderes Konzept.(Punkt)

    Ciao, Frank

    1. Hallo,

      Da von "Zweideutigkeiten" zu sprechen, ist einfach schwachsinnig. Genauso schwachsinnig, als wenn ich mich halbwissend über Oracle auslassen würde. Es ist einfach ein anderes Konzept.(Punkt)

      Öh... was hat Dich denn hier geritten? "Zweideutigkeiten"? Ich lese das Wort hier im Thread in Deinem Posting zum ersten Mal. Worauf beziehst Du Dich denn bitte? Und warum hier am Ende so garstig?

      Viele Grüße,
      Christian

      1. Moin,

        der begriff datenbank unter mssql ist also zweideutig.

        siehe https://forum.selfhtml.org/?t=162710&m=1059082 ;)

        Ich nehme speziell Anstoss an der bekräftigenden Verwendung von "also".

        Ciao, Frank

        1. Hello Frank,

          der begriff datenbank unter mssql ist also zweideutig.
          siehe https://forum.selfhtml.org/?t=162710&m=1059082 ;)

          Ich nehme speziell Anstoss an der bekräftigenden Verwendung von "also".

          Und warum? Der Begriff ist im Allgemeinen schon mehrdeutig. Wenn er dann in Bezug auf mssql nur noch zweideutig ist, ist das doch schon ein Fortschritt, wobei ich natürlich einräumen muss, dass das Wort "zweideutig" zumindest im Deutschen schon zweideutig ist. DIE nehmen aber mWn hauptsächlich MySQL und nicht mssql, weil dort nämlich an allem gesprat wird, nur nicht an der Vaseline...

          *grins*

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        2. Hallo Frank,

          der begriff datenbank unter mssql ist also zweideutig.
          siehe https://forum.selfhtml.org/?t=162710&m=1059082 ;)

          Ich nehme speziell Anstoss an der bekräftigenden Verwendung von "also".

          Oh, achso, hmm, kein Wunder dass ich nicht verstanden habe, worauf Du Dich beziehst. Ok, ich ziehe meinen Einwand zurück.

          Viele Grüße,
          Christian

  5. Hallo,

    MSSQL

    Da kenne ich mich nicht mit aus.

    Wie siehts mit PGSQL order Oracle aus, weiss das wer?

    Postgresql: Postgresql kennt Datenbanken und Schemata. Datenbank ist das, was man beim Verbinden angibt. Jede Datenbank ist nochmal in Schemata unterteilt, das Default-Schema ist 'public'. Jedes Schema enthält dann die Tabellen. Zugegriffen auf verschiedene Tabellen wird per datebankname.schemaname.tabellenname. Allerdings: Postgres kann KEINE Datenbankübergreifenden Abfragen DIREKT durchführen, d.h. ein SELECT * FROM db1.public.tabelle1, db2.public.tabelle2 wird in PostgreSQL fehlschlagen. Es gibt in PostgreSQL allerdings eine Alternative: Die dblink-Erweiterung. Zuerst einmal: Du musst auf der Datenbank, auf der Du die Abfragen laufen lassen willst, erst einmal ein SQL laufen lassen, das die nötigen Funktionen erstellt. Das heißt 'dblink.sql' und findet sich irgendwo in der Postgres-Installation. Wenn das gelaufen ist, kannst Du Abfragen der Art SELECT * FROM dblink ('dbname=anderedb', 'SELECT spalte1, spalte2 FROM tabelle') AS t1(spalte1 typ1, spalte2 type2) absetzen - und dann natürlich auch mit JOINs arbeiten. Allerdings musst Du hier explizit die Typen der zurückgegebenen Abfrage definieren. Außerdem ist's möglich, sich das als VIEW zu definieren, damit man sich beim Abfragen Aufwand spart.

    Oracle: Oracle unterteilt Datenbanken in Instanzen und Schemata. Eine Instanz ist im Prinzip das, was man unter anderen DBMS als 'Datenbank' besteht, wenn auch Oracle da ein paar Eigenheiten hat. Jede Datenbank ist in Schemata unterteilt - und die ergeben sich aus den Nutzern, die auf die Datenbank Zugriff haben. Das heißt: Wenn ich einen user USER01 anlege in Oracle in einer Instanz, dann wird für den automatisch auch ein Schema USER01 angelegt. Ich kann innerhalb einer Instanz problemlos per 'schemaname.tabellenname' auf andere Tabellen innerhalb andere Schemata (d.h. von anderen User angelegte) zugreifen - WENN die entsprechenden Zugriffsrechte (GRANT) gesetzt sind. Wenn ich von Oracle aus auf eine andere Instanz (!) zugreifen will, dann gibt es sogenannte Database Links - auf der Seite wird auch erklärt, wie man dann per SELECT auf die Tabellen zugreift. Zudem ist es bei Oracle eine Überlegung wert, ob man nicht aus Performancegründen (sofern man nicht immer 100%ig aktuelle Daten benötigt) noch zusätzlich mit sogenannten "Materialized Views" arbeitet, d.h. sich die Daten in regelmäßigen Abständen von der anderen Datenbank synchronisieren lässt.

    Viele Grüße,
    Christian

    1. yo,

      Oracle: Oracle unterteilt Datenbanken in Instanzen und Schemata. Eine Instanz ist im Prinzip das, was man unter anderen DBMS als 'Datenbank' besteht.

      bei Oracle sind instanzen und datenbanken zwei verschiedene dinge, so handelt es sich bei einer instanz "nur" um die prozesse und der sga, aber nicht um die datendateien oder schemta, welche wiederum zu der datenbank gehören.

      Ilja