Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Tabelle erweitern / Join Frage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Michi_R, 26 März 2013.

  1. Michi_R

    Michi_R Fleissiger Benutzer

    Hallo,

    ich habe folgendes gegeben:
    Tabelle mit 4 Spalten, Lagernummer, Regalnummer, Platznummer, status.
    In der Tabelle befinden sich nur einträge (zeilen) von den plätzen in denen auch etwas drin liegt.
    Ich möchte nun eine Tabelle in der ALLE Zeilen (Plätze) drin sind. in Plätzen in denen nichts liegt soll Null stehn.

    Wie setzt man das am besten um?
    Ich hätte es so gemacht:
    Eine zweite tabelle erstellt mit den selben Spaltennamen, jeden Platz in jedem Regal in jedem Lager eingetragen, Status bei allen auf NULL.
    Dann einen Join der beiden tabellen und in der Ergebnistabelle soll er dann in alle Statusfelder in denen was liegt die werte mitgenommen haben (status ist vom typ varchar), in denen wo nichts liegt steht weiterhin null.
    Wie sieht denn der Join aus? Problem ist, der Platz kann nur über Lagernummer, Reglnummer, Platznummer eindeutig identifiziert werden, denn einen Platz 10 gibt es in jedem Regal und ein Regl 5 in jedem Lager. Und beim Join braucht man ja eigtl ein eindeutiges Merkmal, anhand dessen man die Tabellen verbinden kann. Das bereitet mir beim Join bis jetzt Probleme.

    Hoffe ihr könnt mir helfen.

    Gruß,
    Michi_R
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Geht alles ;-)

    Du hast:

    Code:
    test=*# select * from lager ;
    lager | regal | platz
    -------+-------+-------
        1 |    5 |    5
        3 |    2 |    1
        3 |    3 |    4
    (3 rows)
    
    und suchst (angenommen für 3 Lager, 5 Regale und je 5 Plätze):

    Code:
    with l as (select * from generate_series(1,3)lager), r as (select * from generate_series(1,5)regal), p as (select * from generate_series(1,5)platz) select l.lager,r.regal,p.platz, count(x) from l cross join r cross join p left join lager x on (l.lager,r.regal,p.platz)=(x.lager,x.regal,x.platz) group by 1,2,3 order by 1,2,3;
    lager | regal | platz | count
    -------+-------+-------+-------
        1 |    1 |    1 |    0
        1 |    1 |    2 |    0
        1 |    1 |    3 |    0
        1 |    1 |    4 |    0
        1 |    1 |    5 |    0
        1 |    2 |    1 |    0
        1 |    2 |    2 |    0
        1 |    2 |    3 |    0
        1 |    2 |    4 |    0
        1 |    2 |    5 |    0
        1 |    3 |    1 |    0
        1 |    3 |    2 |    0
        1 |    3 |    3 |    0
        1 |    3 |    4 |    0
        1 |    3 |    5 |    0
        1 |    4 |    1 |    0
        1 |    4 |    2 |    0
        1 |    4 |    3 |    0
        1 |    4 |    4 |    0
        1 |    4 |    5 |    0
        1 |    5 |    1 |    0
        1 |    5 |    2 |    0
        1 |    5 |    3 |    0
        1 |    5 |    4 |    0
        1 |    5 |    5 |     1
        2 |    1 |    1 |    0
        2 |    1 |    2 |    0
        2 |    1 |    3 |    0
        2 |    1 |    4 |    0
        2 |    1 |    5 |    0
        2 |    2 |    1 |    0
        2 |    2 |    2 |    0
        2 |    2 |    3 |    0
        2 |    2 |    4 |    0
        2 |    2 |    5 |    0
        2 |    3 |    1 |    0
        2 |    3 |    2 |    0
        2 |    3 |    3 |    0
        2 |    3 |    4 |    0
        2 |    3 |    5 |    0
        2 |    4 |    1 |    0
        2 |    4 |    2 |    0
        2 |    4 |    3 |    0
        2 |    4 |    4 |    0
        2 |    4 |    5 |    0
        2 |    5 |    1 |    0
        2 |    5 |    2 |    0
        2 |    5 |    3 |    0
        2 |    5 |    4 |    0
        2 |    5 |    5 |    0
        3 |    1 |    1 |    0
        3 |    1 |    2 |    0
        3 |    1 |    3 |    0
        3 |    1 |    4 |    0
        3 |    1 |    5 |    0
        3 |    2 |    1 |    1
        3 |    2 |    2 |    0
        3 |    2 |    3 |    0
        3 |    2 |    4 |    0
        3 |    2 |    5 |    0
        3 |    3 |    1 |    0
        3 |    3 |    2 |    0
        3 |    3 |    3 |    0
        3 |    3 |    4 |    1
        3 |    3 |    5 |    0
        3 |    4 |    1 |    0
        3 |    4 |    2 |    0
        3 |    4 |    3 |    0
        3 |    4 |    4 |    0
        3 |    4 |    5 |    0
        3 |    5 |    1 |    0
        3 |    5 |    2 |    0
        3 |    5 |    3 |    0
        3 |    5 |    4 |    0
        3 |    5 |    5 |    0
    (75 rows)
    
    Die Tabellen für Lager, Regal und Platz hab ich 'on-the-fly' erzeugt.

    Andreas
     
  3. Michi_R

    Michi_R Fleissiger Benutzer

    Super, ist genau das was ich gesucht habe.
    Nur noch feolgendes Problem:
    Ich habe in meinen Spalten leider nicht int werte stehen, sonder sowas wie "Lager01" und "Regel01".
    Wie passt das dann zsuammen? weil wenn ich neue tabellen erzeuge mit 1, 2 usw..dann passt 1 und Lager01 ja nicht mehr ganz zusammen.
    Bzw kannst du mir sagen wie ich meine ganzen "Lager01" zu 01 oder 1 convertieren kann?
    Bzw die genannte tabelle ist schon eine aus einer Abfrage erzeugte Tabelle, vllt kann der Konvert gleich in diese Abfrage mit eingebaut werden.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Also aus einem Text wie '123abc789xyz' nur die Zahlen rausklaubeln und als INT konvertieren? Easy:

    Code:
    test=*# select regexp_replace('123abc789xyz','[^0-9]','','g')::int * 10 as "Zahl mal 10";
     Zahl mal 10
    -------------
         1237890
    (1 row)
    
    Die schlechte Nachricht für Dich: soweit ich weiß kennt MySQL diese Funktion nicht. Wenn das aber immer gleich aufgebaut ist, bekommst das sicher auch mit substring oder so hin.

    Andreas
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden