Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [gelöst] Join für Zeilen nicht Spalten (https://www.delphipraxis.net/63538-%5Bgeloest%5D-join-fuer-zeilen-nicht-spalten.html)

Thanatos81 20. Feb 2006 13:34

Datenbank: MySQL • Version: 4.1.13 • Zugriff über: ZEOS

[gelöst] Join für Zeilen nicht Spalten
 
Tach zusammen!

Folgendes Problem: Ich habe in meiner DB zwei Tabellen gleicher Struktur, also z.B.

Tabelle temp
------------
LfdNr Integer
Name VarChar
Borname VarChar



Tabelle haupt
-------------
LfdNr Integer
Name VarChar
Vorname VarChar

Nun würde ich ja mittel
SQL-Code:
SELECT Vorname, Name FROM temp
und
SQL-Code:
SELECT Vorname, Name FROM haupt
zwei Resultsets mit den Daten aus jeweiliger Tabelle bekommen. Gibt es eine Möglichkeit, diese beiden Resultsets miteinander zu verknüpfen, so dass erst die Daten aus temp und dann die aus haupt angezeigt werden?

Vielen Dank im Voraus,

marabu 20. Feb 2006 13:40

Re: Join für Zeilen nicht Spalten
 
Hallo Thomas,

UNION heißt der Operator, mit dem du zwei homogene result sets vereinigen kannst.

Grüße vom marabu

Thanatos81 20. Feb 2006 13:41

Re: Join für Zeilen nicht Spalten
 
Danke! Ich wusste doch, dass es sowas gab, nur wenn man den noch nicht benutzt hat, fällt zumindest mir das Namen merken so schwer :oops:

Thanatos81 20. Feb 2006 15:09

Re: Join für Zeilen nicht Spalten
 
Vielleicht darf ich ja nochmal stören ;-)
Mein Ansatz war jetzt Folgender:
SQL-Code:
    (
        SELECT "Probenbezeichnung" AS Parameter,
            MAX(IF(labkopf.lfdnr = "1472",labkopf.Probenbezeichnung,"")) AS "LG200501469",
            MAX(IF(labkopf.lfdnr = "1556",labkopf.Probenbezeichnung,"")) AS "LG200501553"
        FROM labkopf, labparameter
        LEFT JOIN labpositionen ON labpositionen.parameter = labparameter.lfdnr
        WHERE labkopf.lfdnr = labpositionen.berichtsnr
              AND labpositionen.BerichtsNr IN (1472, 1556)
              AND labPositionen.Parameter IN (85)
        GROUP BY labparameter.lfdnr
    )

UNION ALL

    (
        SELECT labparameter.name AS Parameter,
            MAX(IF(labkopf.lfdnr = "1472",labpositionen.wert,"")) AS "LG200501469",
            MAX(IF(labkopf.lfdnr = "1556",labpositionen.wert,"")) AS "LG200501553"
        FROM labkopf, labparameter
        LEFT JOIN labpositionen ON labpositionen.parameter = labparameter.lfdnr
        WHERE labkopf.lfdnr = labpositionen.berichtsnr
              AND labpositionen.BerichtsNr IN (1472, 1556)
              AND labPositionen.Parameter IN (85)
        GROUP BY labparameter.lfdnr
    )
ORDER BY Parameter
Leider bekomme ich nun eine Fehlermeldung:
Code:
Illegal mix of collations for operation 'UNION'
Also ist er anscheinend nicht mit meinen Vergleichen nicht zufrieden, ,die Frage ist nur warum... Jemand ne Idee für mich.

marabu 20. Feb 2006 15:59

Re: Join für Zeilen nicht Spalten
 
Sieht so aus, als würde dem Literal "Probenbezeichnung" im ersten SELECT eine andere COLLATION zugewiesen, als der Spalte labparameter.name im zweiten SELECT. Du musst vielleicht einmal prüfen, welchen default charset der MYSQL Server bei dir verwendet, und welche Festlegungen für die besagte Spalte getroffen wurden.

marabu

himitsu 20. Feb 2006 16:09

Re: Join für Zeilen nicht Spalten
 
Ist es eigentlich auch erlaubt/möglich eine Abfrage über 2 bis 3 Tabellen zu erstellen, also nur über die gleichen Felder (z.B. LfdNr und Name).

Tabelle1: LfdNr, Name, irgendwas
Tabelle2: LfdNr, Name, irgendwas2, irgendwas3

Und wenn möglich noch einen gemeinsamen automatischen Index für die Tabellen einzustellen?
(also z.B. LfdNr als eindeutige ID in den 2-3 Tabellen)

marabu 20. Feb 2006 16:48

Re: Join für Zeilen nicht Spalten
 
Du kannst mit dem UNION operator mehrere result sets zu einem einzigen vereinigen. Nicht die Feldnamen müssen gleich sein, sondern die Felddefinitionen (homogene result sets).

Ein gemeinsamer Schlüsselgenerator für mehrere Tabellen ist machbar. Wozu brauchst du sowas?

marabu

Thanatos81 20. Feb 2006 18:08

Re: Join für Zeilen nicht Spalten
 
Zitat:

Zitat von marabu
Sieht so aus, als würde dem Literal "Probenbezeichnung" im ersten SELECT eine andere COLLATION zugewiesen, als der Spalte labparameter.name im zweiten SELECT. Du musst vielleicht einmal prüfen, welchen default charset der MYSQL Server bei dir verwendet, und welche Festlegungen für die besagte Spalte getroffen wurden.

marabu

Jupp, das wars. Mein Kollege hatte die Datenbank mit
Code:
DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;
angelegt und ich meine Tabellen mit
Code:
DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
Wieso sagt ein Kollege einem sowas auch nicht :wall:

Danke dir nochmal, marabu!

himitsu 21. Feb 2006 11:59

Re: Join für Zeilen nicht Spalten
 
Zitat:

Zitat von marabu
Du kannst mit dem UNION operator mehrere result sets zu einem einzigen vereinigen. Nicht die Feldnamen müssen gleich sein, sondern die Felddefinitionen (homogene result sets).

OK, dann ist es ja gut :)

Also wenn ich jetzt dennoch einige Felder drin hab, mit unterschiedlichen Felddefinitionen, aber diese Felder nicht mit ins Suchergebnis mit aufnehme, dann sollte es also auch gehen?

Zitat:

Zitat von marabu
Ein gemeinsamer Schlüsselgenerator für mehrere Tabellen ist machbar. Wozu brauchst du sowas?

Ich nehme ja den Index auch gleichzeitig mit als Dateiname und speichere nur die ID für die Dateiendung mit ab, somit kann es also nicht passieren, wenn ich zwei Dateien mit dem selben Namen in der Liste hab, sich die Dateien gegenseitig überschreiben.
Im Grunde ginge es auch ohne einen gemeinsamen Index, aber mit wäre es auch mal möglich die Dateien von 2... Dateilisten in einem Verzeichnis abzulegen, ohne daß es zu Überschneidungen kommen kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz