Tabelle erweitern / Join Frage

Michi_R

Fleissiger Benutzer
Beiträge
81
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
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


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
 

Michi_R

Fleissiger Benutzer
Beiträge
81
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.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
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
 
Oben