Pete: 2 Tabellen zusammen sortieren

Hallo,

ich steh mal wieder auf der Leitung und hab da ein "kleines" Problem: Wie kann ich aus 2 Tabellen einer Datenbank alle Datensätze nach Namen sortiert ausgeben. Ich habe in einer Datenbank (Sybase) zwei Tabellen, die so ziemlich identisch sind. Nun möchte ich die Daten beider Tabellen zusammengefügt und alphabetisch (Name, Vorname) sortiert haben und ausgeben. Die Tabellen jeweils für sich sortieren und ausgeben ist ja nicht das Problem. Aber wie zusammen sortieren? Also, dass Anton aus Tabelle 1, dann Axel aus Tabelle 2, dann Berta aus Tabelle 1, usw. ausgegeben wird. Ich weiss nicht, ob das über temporäre Tabellen geschehen muss. Hätte auch erst mal keine Ahnung, wie das geht. Oder vielleicht die Daten in einen zweidimensionalen Array einlesen und dann sortieren? Auch keine Ahnung... Vielleicht wisst Ihr ja noch eine bessere Lösung. Vielleicht geht das ja relativ einfach mit SQL?

Hmm, kam mir gerade so die Idee beim Schreiben: vielleicht wäre es ja besser gewesen, nur eine Tabelle zu nehmen, wenn die Tabellen eh fast identisch sind. Na ja, egal. Dazu hab ich jetzt keine Zeit mehr.

Viele Grüsse
Pete

  1. Hallo!

    Du köntest erstmal alle Datensätze der einen auslesen (Bspw. mit PHP)
    und dabei gleich in die andere Einfügen.
    Damit wäre der erste Schritt, das einfügen erledigt.

    Und nun musst du nur noch eine Abfrage nach Namen sortiert starten:
    SELECT * FROM database SORT BY feldname

    Wenn du das ganze jetzt auch per "for ($i=1, ....)" mit der Anzahl der Datensätze machst, kannst du die dann in einen Array speichern und den dann nachher aufsteigend ausgeben lassen, dann werde auch die Namen Alphabetisch ausgegeben!

    Ich hoffe ich hab da jetzt keinen Fehler eingebaut! ;)

    Gruss Adrian

    1. Hallo,

      ich denke, so kann ich das nicht machen, da die Daten der einen Tabelle nicht in die andere eingetragen werden sollen. Es sind eben 2 verschiedene Tabellen, die aber ziemlich ähnlich sind (bis auf ein paar Felder). Ich denke mal, der Tipp mit "UNION" war das, was ich gesucht habe. Jetzt werde ich mir das mal genauer im Handbuch durchlesen. Vielen Dank...

  2. Halihallo Pete

    ich steh mal wieder auf der Leitung und hab da ein "kleines" Problem: Wie kann ich aus 2 Tabellen einer Datenbank alle Datensätze nach Namen sortiert ausgeben. Ich habe in einer Datenbank (Sybase) zwei Tabellen, die so ziemlich identisch sind. Nun möchte ich die Daten beider Tabellen zusammengefügt und alphabetisch (Name, Vorname) sortiert haben und ausgeben. Die Tabellen jeweils für sich sortieren und ausgeben ist ja nicht das Problem. Aber wie zusammen sortieren? Also, dass Anton aus Tabelle 1, dann Axel aus Tabelle 2, dann Berta aus Tabelle 1, usw. ausgegeben wird. Ich weiss nicht, ob das über temporäre Tabellen geschehen muss. Hätte auch erst mal keine Ahnung, wie das geht. Oder vielleicht die Daten in einen zweidimensionalen Array einlesen und dann sortieren? Auch keine Ahnung... Vielleicht wisst Ihr ja noch eine bessere Lösung. Vielleicht geht das ja relativ einfach mit SQL?

    Unterstützt Sybase UNION's? - UNION (Vereinigungsmenge) der beiden Tabellen und dann
    sortieren.

    Viele Grüsse

    Philipp

  3. Hallo,

    die Verknüpfung zweier Tabellen in einer Datenbank klappt jetzt mittels UNION ganz gut. Die Frage ist jetzt für mich nur noch, wie kann ich bei Ausgabe der Daten jetzt feststellen, aus welcher Tabelle sie gekommen sind. Also, es sollen Name und Vorname aus beiden Tabellen alphabetisch sortiert ausgegeben werden. Jetzt möchte ich natürlich einen Link auf den Namen legen, damit ich mir den kompletten Datensatz anzeigen lassen kann. Dazu muss ich natürlich wissen, aus welcher der beiden Tabellen ich die Daten bekommen habe.

    Bitte helft mir...

    Pete

    1. Halihallo Pete

      die Verknüpfung zweier Tabellen in einer Datenbank klappt jetzt mittels UNION ganz gut. Die Frage ist jetzt für mich nur noch, wie kann ich bei Ausgabe der Daten jetzt feststellen, aus welcher Tabelle sie gekommen sind. Also, es sollen Name und Vorname aus beiden Tabellen alphabetisch sortiert ausgegeben werden. Jetzt möchte ich natürlich einen Link auf den Namen legen, damit ich mir den kompletten Datensatz anzeigen lassen kann. Dazu muss ich natürlich wissen, aus welcher der beiden Tabellen ich die Daten bekommen habe.

      Wie schaut dein aktueller Query aus?

      ---

      Nun, ein UNION ist eigentlich nicht dafür gedacht, dass die Einträge dann doch noch
      einer gewissen Tabelle zugeordnet sind, dennoch ein Tipp:

      Du verbindest die Ergebnismengen zweier SELECT Statements über UNION, oder? - Dann tue
      doch einfach in das eine SELECT Statement ein SELECT '1' AS Origin und in das zweite
      ein SELECT '2' AS Origin. In der Ergebnismenge des UNIONS findest du dann eine Spalte
      namens Origin mit jeweils dem Wert 1 oder 2 (und über diese Information kannst du dann
      auf die Tabelle schliessen).

      ---

      Und zum Thread weiter oben: Natürlich, hier wird sogar bis ganz zu unterst gelesen!

      Viele Grüsse

      Philipp

      1. Wie schaut dein aktueller Query aus?

        So sieht der bisherige select-Befehl aus:
        SELECT id1, name, vorname FROM tab1 UNION ALL SELECT id2, name, vorname FROM tab2 ORDER BY name, vorname

        Und so würde er mit Deinem Tipp aussehen:
        SELECT '1' AS origin, id1, name, vorname FROM tab1 UNION ALL SELECT '2' AS origin, id2, name, vorname FROM tab2 ORDER BY name, vorname

        Dann würde eine neue Spalte mit dem Namen "origin" mit den Werten 1 oder 2 gefüllt werden? Ich werde das jetzt gleich mal testen.

        Und zum Thread weiter oben: Natürlich, hier wird sogar bis ganz zu unterst gelesen!

        Super, hab ich mich ja ganz schön getäuscht. Auf jeden Fall vielen Dank für Eure nette und bisher erfolgreiche Hilfe.

        Viele Grüsse
        Pete

        1. Hallo,

          sehr schön. Genau so wie es sein soll. Den Datensätzen wird jetzt jeweils die 1 oder die 2 zugeordnet. Jetzt komme ich ein grosses Stück weiter. Vielen Dank.

          Pete

  4. Hallo,

    dank Eurer Hilfe klappt das mit der UNION-Abfrage aus den 2 Tabellen mittlerweile ganz gut. Jetzt kommt mein nächstes Problem: ich möchte nun pro Seite immer nur eine bestimmte Anzahl der Datensätze anzeigen lassen. Dann soll weitergeblättert werden können. Ähnlich wie bei den Suchmaschinen. Bei MySQL wäre das in der SELECT-Abfrage mit LIMIT möglich. Bei Sybase gibt es dies nicht. Es gibt die Möglichkeit, BETWEEN zu verwenden, dazu bräuchte ich aber eine Durchnummerierung der zuvor gemachten Ausgabe. Habe aber leider bisher noch nichts dazu in dem Handbuch gefunden. Vielleicht wäre es ähnlich wie in meinem vorherigen Problem möglich, während der UNION-Abfrage eine weitere Spalte anzulegen, in der die Nummerierung erfolgt, auf die dann mit BEWTWEEN zugegriffen werden kann. Na ja, hört sich vielleicht etwas abenteuerlich an und ihr habt eine bessere Lösung im Ärmel...

    Viele Grüsse
    Pete

    1. Halihallo Pete

      dank Eurer Hilfe klappt das mit der UNION-Abfrage aus den 2 Tabellen mittlerweile ganz gut. Jetzt kommt mein nächstes Problem: ich möchte nun pro Seite immer nur eine bestimmte Anzahl der Datensätze anzeigen lassen. Dann soll weitergeblättert werden können. Ähnlich wie bei den Suchmaschinen. Bei MySQL wäre das in der SELECT-Abfrage mit LIMIT möglich. Bei Sybase gibt es dies nicht.

      Ich kenne leider keine entsprechende Direktive (aber das heisst nichts).

      Es gibt die Möglichkeit, BETWEEN zu verwenden, dazu bräuchte ich aber eine Durchnummerierung der zuvor gemachten Ausgabe.

      Das halte ich für keine gute Idee. Es _muss_ irgendeine andere Möglichkeit geben.

      Habe aber leider bisher noch nichts dazu in dem Handbuch gefunden. Vielleicht wäre es ähnlich wie in meinem vorherigen Problem möglich, während der UNION-Abfrage eine weitere Spalte anzulegen, in der die Nummerierung erfolgt, auf die dann mit BEWTWEEN zugegriffen werden kann. Na ja, hört sich vielleicht etwas abenteuerlich an und ihr habt eine bessere Lösung im Ärmel...

      mit

      set rowcount 10

      kannst du die Ausgabe auf 10 Datensätze beschränken. Leider kann man das wohl nicht (?)
      in einem SQL Query einbinden, sodass sowas möglich wäre:

      set rowcount 10
      SELECT * FROM ... WHERE ID NOT IN ALL (
         set rowcount 100;
         SELECT * FROM ...
      )

      das wäre eine Möglichkeit, wie man 10 Datensätze beginnend mit Datensatz 100 aus-
      geben könnte, jedoch wird das, wie gesagt, nicht funktionieren.

      SELECT TOP x ... gibt es in Sybase auch nicht, dann liesse sich der Query von oben
      ganz einfach realisieren.

      Naja, vielleicht helfen dir die Überlegungen für etwas, was du vielleicht noch in der
      Doku findest. Ich kenne mich mit Sybase nicht aus. Wenn du was findest, würde ich mich
      dafür interessieren.

      Viele Grüsse

      Philipp