Mehre Spalten in einer Spalte ausgeben und mit Right Join verbinden

DarkX7R

Neuer Benutzer
Beiträge
3
Hallo,

ich bin relativ neu was SQL angeht. Ich habe 2 Datenbanken. Einen Artikelstamm und einen Lagerbestand. Ich möchte alle Artikel aus dem Artikelstamm und die dazugehörigen Bestände. Mir ist klar das ich das Ganze mit right bzw. left join erreichen kann.

Nur habe ich das Problem, dass ich nicht eine eindeutige Spalte für den Artikel habe, sondern 5.
Artikelnummer + Farbe + Breite + Sove + Form

Ich habe es auch erreicht, diese 5 Spalten mir in einer auszugeben.

Nur scheitere ich aktuell daran, die neu kreierten Spalten miteinander zu verknüpfen.

Ich hoffe jemand hat eine Idee, wie man mein Problem lösen kann.
 
Werbung:
Bisher habe ich meine Datenbanken immer mit Access gebaut. Dort habe ich mir dann 2 Hilfstabellen angelegt, wo ich jeweils die eindeutige Spalte erstellt habe. Damit konnte ich dann in der nachfolgenden Abfrage die neuen Spalten hernehmen.

Nur verwende ich jetzt ein Programm mit dem ich auf die Live Datenbanken aus unserem ERP-System zugreife. Dementsprechend kann ich nicht die Basis Datenbanken ändern, sondern muss meine Abfrage so hinbekommen, dass ich das gewünschte Ergebnis erreiche.
 
um das mal versuchen nachzuvollziehen, mit 3 Spalten als PK/FK:

Code:
test=*# create table artikel (nummer int, farbe text, breite int, name text, primary key (nummer, farbe, breite));
CREATE TABLE
test=*# create table bestand(nummer int, farbe text, breite int, anzahl int, foreign key(nummer,farbe,breite) references artikel);
CREATE TABLE
test=*# select a.nummer, a.farbe, a.breite, a.name, sum(b.anzahl) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
 nummer | farbe | breite | name | sum
--------+-------+--------+------+-----
(0 rows)

test=*#

Achtung: das ist kein M$SQL, Syntax kann da anders sein.
 
Ich glaube du suchst einfach einen passenden Join. Beispiel:
Code:
SELECT * FROM tabelle1 t1 LEFT JOIN tabelle2 t2 ON t1.spalte1 = t2.spalte1 AND t1.spalte2 = t2.spalte2 AND t1.spalte3 = t2.spalte3 AND t1.spalte4 = t2.spalte4 AND t1.spalte5 = t2.spalte5
Ist natürlich mühsam, ein künstlicher Primärschlüssel würde sich anbieten.
 
Ich glaube du suchst einfach einen passenden Join. Beispiel:
Code:
SELECT * FROM tabelle1 t1 LEFT JOIN tabelle2 t2 ON t1.spalte1 = t2.spalte1 AND t1.spalte2 = t2.spalte2 AND t1.spalte3 = t2.spalte3 AND t1.spalte4 = t2.spalte4 AND t1.spalte5 = t2.spalte5
Ist natürlich mühsam, ein künstlicher Primärschlüssel würde sich anbieten.

Also das habe ich bereits probiert und ich bekomme nur alle Artikel wo ich auch Bestand habe. Die Artikel ohne Bestand werden nicht gezeigt.
 
works for me:

Code:
test=*# create table artikel (nummer int, farbe text, breite int, name text, primary key (nummer, farbe, breite));
CREATE TABLE
test=*# create table bestand(nummer int, farbe text, breite int, anzahl int, foreign key(nummer,farbe,breite) references artikel);
CREATE TABLE
test=*# select a.nummer, a.farbe, a.breite, a.name, sum(b.anzahl) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
 nummer | farbe | breite | name | sum
--------+-------+--------+------+-----
(0 rows)

test=*# \d artikel
              Table "public.artikel"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 nummer | integer |           | not null |
 farbe  | text    |           | not null |
 breite | integer |           | not null |
 name   | text    |           |          |
Indexes:
    "artikel_pkey" PRIMARY KEY, btree (nummer, farbe, breite)
Referenced by:
    TABLE "bestand" CONSTRAINT "bestand_nummer_farbe_breite_fkey" FOREIGN KEY (nummer, farbe, breite) REFERENCES artikel(nummer, farbe, breite)

test=*# insert into artikel values (1, 'blau',10, 'blauer artikel');
INSERT 0 1
test=*# insert into artikel values (2, 'rot',20, 'roter artikel');
INSERT 0 1
test=*# \d bestand
              Table "public.bestand"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 nummer | integer |           |          |
 farbe  | text    |           |          |
 breite | integer |           |          |
 anzahl | integer |           |          |
Foreign-key constraints:
    "bestand_nummer_farbe_breite_fkey" FOREIGN KEY (nummer, farbe, breite) REFERENCES artikel(nummer, farbe, breite)

test=*# insert into bestand values (1,'blau',10,100);
INSERT 0 1
test=*# select a.nummer, a.farbe, a.breite, a.name, sum(b.anzahl) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
 nummer | farbe | breite |      name      | sum
--------+-------+--------+----------------+-----
      2 | rot   |     20 | roter artikel  |   
      1 | blau  |     10 | blauer artikel | 100
(2 rows)

test=*# select a.nummer, a.farbe, a.breite, a.name, coalesce(sum(b.anzahl),0) from artikel a left join bestand b on ((a.nummer, a.farbe, a.breite)=(b.nummer,b.farbe,b.breite)) group by a.nummer, a.farbe, a.breite;
 nummer | farbe | breite |      name      | coalesce
--------+-------+--------+----------------+----------
      2 | rot   |     20 | roter artikel  |        0
      1 | blau  |     10 | blauer artikel |      100
(2 rows)

test=*#
 
Werbung:
Du zeigst nach wie vor nicht deinen SQL Code. Ich rate mal du hast deinen Bestand im FROM-Teil und per Join die Tabelle Artikelstamm geholt. Dann müsstest du das nur drehen, also alle Artikelstammdaten holen und per Join den Bestand dazu holen.
 
Zurück
Oben