Announcement

Collapse
No announcement yet.

Outer-join über 2 Datenbankinstanzen von Oracle

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

  • Outer-join über 2 Datenbankinstanzen von Oracle

    Ich bräuchte eine Möglichkeit einen Outer-join in Oracle über 2 Datenbankinstanzen abzusetzen.
    Ich brauche aber eine genaue Erklärung, da ich ein Neulich im Bereich Oracle bin.

  • #2
    Hallo Tobias,

    dafür brauchst du als erstes einen Datenbanklink, also die Verbindung zwischen beiden DB. Dafür mußt du vorher abklären, wie sich der DB-Link auf der entfernten DB connecten soll. Zum probieren bietet sich der Connect auf einen festen Benutzer an (hier der ORACLE Test-User SCOTT mit PW tiger):<pre>
    CREATE PUBLIC DATABASE LINK TEST_LINK
    CONNECT TO SCOTT IDENTIFIED BY "tiger"
    USING 'TNS_TEST';</pre>
    Die Angabe TNS_TEST ist dabei ein gültiger Eintrag aus der TNSNAMES.ora für die entfernte Datenbank.
    Anschließend kannst du mit der Syntax <i>tabelle@TEST_LINK</i> auf jede Tabelle, Procedure, View etc. auf der entfernten DB zugreifen, für die der User SCOTT dort die entsprechenden Zugriffsrechte hat:<pre>
    SELECT *
    FROM TAB_LOCAL A,
    TAB_REMOTE@TEST_LINK B
    WHERE A.PK = B.FK(+);</pre>
    Um mal ein Bsp. für einen Outer-Join zu machen.

    Ich hoffe das hilft als Ansatz.

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      wir lesen momentan mit folgendem Befehl aus:

      SELECT T.TabellenName, A.Table_name
      FROM All_Tables A right join TTabellen@Test T
      on T.Tabellenname = A.Table_name;

      oder:

      SELECT T.TabellenName, A.Table_name
      FROM All_Tables A, TTabellen@Test T
      where T.Tabellenname = A.Table_name(+);

      Wir bekommen aber keine Schnittmenge, sondern immer nur die Menge einer Tabelle und die Werte der anderen Tabelle sind 'null'!

      Kann das an den Datentypen liegen

      Comment


      • #4
        Hallo Tobias,

        wenn du die exakte Schnittmenge benötigst, dann solltest du deine Abfrage mit einem inner join gestalten. Ein outer join liefert dir immer <b>alle</b> Daten einer Tabelle und die passenden Daten der gejointen Tabelle.
        Bsp. A: (1,2,3,4,5,6,7,8), B: (5,6,7,8,9,0)
        dann liefert <pre>select ... where A(+) = B
        5,5
        6,6
        7,7
        8,8
        ,9
        ,0</pre>
        und <pre>select ... where A = B(+)
        1,
        2,
        3,
        4,
        5,5
        6,6
        7,7
        8,8</pre>
        und <pre>select ... where A = B
        5,5
        6,6
        7,7
        8,8</pre>

        Gruß Fal
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Danke,

          aber ich glaube ich habe mich unklar ausgedrückt.

          Wir benötigen die Menge, die ein OuterJoin liefert, abzüglich der Schnittmenge.

          Das Problem ist wenn in Tabelle A der Wert:
          TARTIKEL

          steht und in Tabelle B der Wert:
          TArtikel (oder) TARTIKEL

          liefert der OuterJoin

          (Wert Tabelle A: TARTIKEL)
          (Wert Tabelle B: 'NULL')

          Nachdem wir Abfragen wollen ab in Tabelle A ein
          Wert dazugekommen ist oder gelöscht wurde, bringt uns das Ergebnis 'Null' von Tabelle B nichts.

          Gruß Tobia

          Comment


          • #6
            Hallo,

            irgendwie verstehe ich nicht so richtig was du eigentlich unterm Strich haben möchtest! Das Ergebnis eines Outer Join abzgl. der Schnittmenge (also alles was nur in einer Tabelle existiert) bekommst du mit:
            select ... where A = B(+) and B IS NULL;

            Wenn ich dich richtig verstanden habe, dann ist aber dein eigentliches Problem, das du wissen möchtest ob es in Tabelle A Werte gibt die nicht in Tabelle B sind (neu) und gleichzeitig ob es in Tabelle B Werte gibt die nicht in Tabelle A sind (in A gelöscht). Das kannst du jedoch nicht mit einem einfachen Outer Join erschlagen. Ich würde dieses Problem so angehen:<pre>
            SELECT A.Table_name
            FROM All_Tables A
            WHERE A.Table_name NOT IN (
            SELECT T.Tabellenname
            FROM TTabellen@Test T) /* Alle neuen in A */
            UNION
            SELECT T.Tabellenname
            FROM TTabellen@Test T
            WHERE T.Tabellenname NOT IN (
            SELECT A.Table_name
            FROM All_Tables A) /* Alle gelöschent in A */
            </pre>
            Gruß Fal
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo,
              die UNION-Abfrage liefert:

              TABLE_NAME

              ------------------------------

              TARTIKEL /*Tabelle A*/

              TARTIKEL /*Tabelle B*/

              TArtikel /*Tabelle B*/

              TBESTELLUNG /*usw.*/

              TBestellung

              TGIROKONTO

              TGirokonto

              TKUNDE

              TKunde

              TMWSTSATZ

              TMWSTSatz

              TPOSITION

              TPosition

              13 Zeilen ausgewählt

              Beide Felder sind VarChar2(30) aber bei einer Abfrage, die beide Felder betrifft, bekomme ich immer von einem Feld 'NULL' zurück

              Comment


              • #8
                Hallo Tobias,

                am besten du machst mal ein Bsp. mit ein paar Datensätzen für beide Tabellen und was dein gewünschtes Ergebnis wäre, sonst reden wir hier anscheinend ständig aneinander vorbei.

                Gruß Fal
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Danke Flak,

                  ich habe mir jetzt Funktion in Delphi programmiert, die mein Problem behoben hat.

                  Das Problem war:

                  Tabelle A:

                  TARTIKEL

                  TPOSITION

                  TTEST

                  Tabelle B:

                  TARTIKEL

                  TPOSITION

                  TTEST2

                  Nun sollte mir der OuterJoin bei der bei der 1. Abfrage 'TTEST' als Ergebnis liefern, um es in 'Tabelle B' eingefügt werden.

                  'TTEST2' sollte bei einem 2. OuterJoin als Ergebnis gefliefert werden, um aus 'Tabelle B' gelöscht zu werden.

                  Nach dem ich die Delphi-Funkion ausprobiert habe, habe ich es noch einmal mit dem OuterJoin probiert. Danach hat er dann aber nur mit den abgeglichenen Daten funktioniert.

                  Ich danke dir nochmals

                  Gruß
                  Tobia

                  Comment

                  Working...
                  X