2 Tabellen verknüpfen anhand Nummer in Feld



  • Ich habe eine Tabelle mit folgendem Inhalt:

    \begin{tabular}{|c|c|c|} \hline Caption & Control & Value\\ \hline XY & nam1 & -\\ YX & btt1 & wert\\ DF & nam2 & -\\ \- & btt2 & noch ein wert\\ \hline \end{tabular}

    Herauskommen soll Ergebnis, das mir Caption und zugehöriger Value zeigt. Verknüpft sind die Controls anhand der nachfolgenden Zahl in "nam1" oder "btt2".
    Bsp.:

    \begin{tabular}{|c|c|} \hline Caption & Value\\ \hline XY & wert\\ YX & noch ein wert\\ \hline \end{tabular}

    Mit Select mid(Control, 4, 3) as captionId, Caption from <table> where Control like 'nam%' bekomme ich schon die Zahl heraus. Nur wie verknüpfe ich das nun in einem Select?



  • Normalisier deine Tabellenstruktur!

    Ich bin zwar fast sicher dass das was du da machen willst geht (ich verstehe nicht genau was du mit dem 1er aus "nam1" oder 2er aus "btt2" machen willst, daher nur fast sicher). Bloss bin ich mir auch ganz sicher, dass das Pfusch ist, und werde daher meine Zeit auch nicht dafür aufwenden, dir zu helfen diesen Pfusch zum Laufen zu bekommen 😉



  • Du willst also die Caption, die Value und die Zahl aus Controls haben wo in Controls "nam" vorkommt?
    ICh sehe hier nur eine Tabelle.
    Das andere soll ja ein Ergebnis sein oder?



  • Normalisier deine Tabellenstruktur!

    Das will ich gar nicht. Die Struktur gefällt mir auch nicht, aber ich muss diese alten Daten in mein neues Schema übernehmen.
    D.h. ich will auch keine neue Tabelle erzeugen, sondern nur den passenden Select-Befehl finden.

    Rauskommen sollen nur noch Caption und Value. Und die scheinen mir über die Control-Spalte miteinander verknüpft.
    z.B. nam1 und btt1 oder nam2 und btt2.

    Wenn ich jetzt die Tabelle per self-join verknüpfen könnte, würde mir das Schreibarbeit sparen.
    D.h. Pseudo-Code: Select t1.Caption, t1.Value from table t1 join table t2 on MidOfBtt(t1.Control, 4, 3) = MidOfNam(t2.control, 4, 3)



  • naja wenns unbedingt sein muss, kannst du ja sub-selects als "table-source" verwenden.

    also

    SELECT t1.a, t1.b, t2.c
         FROM (
             SELECT mid(a, 2, 3) AS a, mid(b, 3, 4) AS b WHERE ... FROM t
             ) AS t1
         INNER JOIN (
             SELECT mid(c, 2, 3) AS c WHERE ... FROM t
             ) AS t2
         ON t1.a = t2.b
    

    hab ich jetzt nicht ausprobiert, aber ich denke mir die syntax müsste so passen...

    falls das nicht geht, schreib bitte dazu mit welchen SQL server du arbeitest. jeder server hat so seinen eigenen SQL dialekt.



  • SELECT t1.a, t2.c
         FROM (
             SELECT mid(a, 4, 3) AS a FROM t WHERE ...
             ) AS t1
         INNER JOIN (
             SELECT mid(c, 4, 3) AS c FROM t WHERE ...
             ) AS t2
         ON t1.a = t2.c
    

    So hab ich es jetzt, bekomme aber keine Ergebniszeile zurück (SQL-Statement ist korrekt). Wieso du das am mit b verknüpft hast, ist mir nicht klar.

    Der "SQL-Server" ist eine Access-Datei (mdb).

    [EDIT]
    Jetzt klappt es wie gewünscht (zumindest in ODBC-Client, nicht aber direkt in Access).



  • Das mit "b" war ein Flüchtigkeitsfehler, sorry.
    Wenn dann hätte es "t1.b = t2.c" heissen müssen (t2.b gibt's ja garnicht).

    Wieso du kein Ergebnis bekommst weiss ich auch nicht.
    Bist du sicher dass du die richtigen beiden Spalten vergleichst?
    Und dass die gaznen "mid()" korrekt sind?


Log in to reply