2 Tabelle verknüpfen...

hallo,
ich habe 2 Tabellen, die 1te ist heist kunden die 2.te heist auftraege.

Tabelle: kunden
sqlpos: fortlaufende Nummer, aus sicht einer Exceltabelle Zeilennummer.(wird auch als Kundennummer verwendet)
Vorname…
Nachname…
ort…
usw

Tabelle: auftraege
ku: kundennummer,
jahr…
farbe…
aufwand…
usw

Mein Ziel: Ich will alle Huber Kunden sehen, die einen Auftrag aus dem Jahr 15 hatten.

comboBox2.Text = "nachname";
textBox2.Text = "Huber";

    sql = "select * from kunden where "+ comboBox2.Text + " like '" + "%" + textBox2.Text + "%" + "';";

Ich bekomme alle Huber angezeigt, wie bekomme ich das join left hinein mit dem Jahr 15?

  <dein bisheriges Stateent> 
  AND Jahr = 15

AND ist das Schlüsselwort das zwei Bedingungen verknüpft.

Gruß Uwe

EDIT: Und vorher mußt du noch deine beiden Tabellen verknüpfen. Hier bietet sich die Kundennummer an. Das sieht dann so aus:

Select * from kunden join auftraege on kunden.id = auftraege.kunden_id where kunden.name = 'Huber' and auftraege.jahr = 15

Das in deine Sprache zu übersetzen überlasse ich dir :wink:

left join ist schon ok.

select k.vorname, k.nachname, a.aufwand from kunden k left join auftraege a on k.sqlpos=a.kundennummer where k.jahr = 15 and k.nachname = ‘huber’

so in der Art.

@Gisman: er verbindet die Spalte mit dem Wert in seinem Statement, ihm fehlt aber der nötige JOIN zur zweiten Tabelle.

hallo,
thx all.

sql = "  Select* from kunden join auftraege on kunden.sqlpos = auftraege.ku where kunden.name = 'Huber' and auftraege.jahr = 15 ;";

Problem 2:
Es kommt die Fehlermeldung:
operator does not exist:integer = character varing
Error

kunden.sqlpos <---- integer
auftraege.ku <---- character varing

Bitte sagt mir jetzt nicht,dass ich “auftraege.ku” umwandeln muss in integer :slight_smile:

das wäre das gescheiteste. Du kannst auch einen CAST verwenden, einfach ::INT anhängen. Das wird aber heftig knallen, wenn es Werte gibt, die nicht gecastet werden können.

Merke Dir für das Leben: immer die richtigen Datentypen verwenden, und in solch einem Falle die Kundennummer in der einen Tabelle als Primary Key definieren und in der Auftragstabelle als Fremdschlüssel.

thx,
funkt 1a.
letzte Frage:
Was muss ich tun dass jeder Kunde nur einmal gelistet wird?
Bei 5 Aufträge kommt der Kunde 5 mal vor.

welchen der 5 Aufträge willst Du denn sehen? Den ältesten, neuesten, größten, kleinsten, durchschnittlichsten? Wenn Du aggregieren willst, so verwenden Aggregatsfunktionen in Verbindung mit GROUP BY.

thx,
hmmm, ich will NUR einen Auftrag sehen, es ist egal welcher. Mein Ziel: Ich will alle Kunden anschreiben, die mir einen Auftrag gegeben haben von dem Jahr z.B. 99.

Wenn ich richtig gegooelt habe, dann macht GROUP BY NUR die Reihenfolge.

ah so.

test=*# select * from kunden ;
 id |  name   
----+---------
  1 | kunde 1
  2 | kunde 2
  3 | kunde3
(3 Zeilen)

test=*# select * from auftraege ;
 ku | jahr 
----+------
  1 |   10
  2 |   20
  2 |   30
  2 |   40
(4 Zeilen)

test=*# select distinct k.id, k.name from kunden k left join auftraege a on (k.id=a.ku);
 id |  name   
----+---------
  2 | kunde 2
  3 | kunde3
  1 | kunde 1
(3 Zeilen)

test=*# select distinct k.id, k.name from kunden k inner join auftraege a on (k.id=a.ku);
 id |  name   
----+---------
  2 | kunde 2
  1 | kunde 1
(2 Zeilen)

test=*#

Du siehst den Weg?

hmmmmmm, die ersten 2 Beispiele habe ich verstanden,der Rest nicht so.

ähm, ja. Dier ersten beiden waren ja auch wirklich simpel. Beschäftige Dich mit JOINs, das wirst Du immer und immer wieder benötigen.

distinct <— steht für keine doppelten Ausgaben (woher weis postgres, ob keine doppelten Aufträge oder doppelten Kunden?
left join <— hänge die 2te Tabelle dran.

distinct bezieht sich (in dieser Form) auf die ganze Zeile. Join ist nicht direkt ‘anhängen’ sondern eher ‘verbinden’.