Anfängerfrage: SQL Abfrage mit 2 Tabellen

datenbeisser

Aktiver Benutzer
Beiträge
38
Hallo zusammen!

Bin leider totaler SQL Anfänger und komme bei der Abfrage / Verknüpfung zweier Tabellen nicht weiter.

Datenbank: DE.db

Beispiel 1:

Tabelle: Daten
ID ....... Ort ................. IDB
1 .......... Kiel ................ 06
2 .......... Nürnberg ...... 12
3 .......... Kassel ............ 03
4 .......... Dresden ......... 08

Tabelle: Codes
IDB ........ Bundesland
03 .......... Hessen
06 .......... Schleswig-Holstein
08 .......... Sachsen
12 ........... Bayern


Beispiel 2:

Tabelle: Daten
ID ...... Ort .............. Land .......... IDB
1 ......... Kiel ................ DE .......... 06
2 ......... Nürnberg ..... DE ........... 12
3 ......... Kassel ........... DE ........... 03
4 ......... Dresden ....... DE .......... 08

Tabelle: Codes
IDB ............. Bundesland
DE.03 ......... Hessen
DE.06 ......... Schleswig-Holstein
DE.08 ......... Sachsen
DE.12 .......... Bayern

Für beide Beispiel möchte ich eine SQL Abfrage nach Ort == 'Kassel' mit folgendem Ergebnis machen:

Ort ............... Bundesland
Kassel .......... Hessen

Wie sieht die jeweilige Synthax der SQL Abfrage für die beiden Beispiele aus?

Danke und Grüße,
Datenbeisser
 
Werbung:
Hallo zusammen!

Bin leider totaler SQL Anfänger und komme bei der Abfrage / Verknüpfung zweier Tabellen nicht weiter.

Wo ist Dein bisheriger Lösungsansatz?

Dein ersten Dings da:

Code:
test=# create table codes (idb int primary key, bundesland text);
CREATE TABLE
test=*# create table daten (ort text, idb int references codes);
CREATE TABLE
test=*# insert into codes values (8, 'Dresden');
INSERT 0 1
test=*# insert into daten values ('Dresden', 8);
INSERT 0 1
test=*# select daten.ort, codes.bundesland from daten left join codes on (daten.idb=codes.idb);
  ort  | bundesland
---------+------------
 Dresden | Dresden
(1 row)

Das zweite ist einklich Bullshit. Oder ich bin grad noch zu müde, eine passende Foreign-Key-Definition zu finden, die den FK aus 2 Spalten vereint.

Daher ohne FK-Beziehung:

Code:
test=# create table daten (ort text, idb text, land text);
CREATE TABLE
test=*# create table codes (idb text primary key, bundesland text);
CREATE TABLE
test=*# insert into daten values ('Sachsen', '08','DE');
INSERT 0 1
test=*# insert into codes values ('DE.08','Dresden');
INSERT 0 1
test=*# select daten.ort, codes.bundesland from daten left join codes on (daten.land||'.'||daten.idb=codes.idb);
  ort  | bundesland
---------+------------
 Sachsen | Dresden
(1 row)

Du wirst das nicht 1:1 alles übernehmen können: das ist PostgreSQL, Du hast MySQL. Die Anpassung ist aber möglich, dies überlasse ich Dir zur Übung.
 
Hallo akretscher,

die Datenbank mit Primary Keys besteht bereits.

Es geht nur um die Abfrage mit der Verknüpfung der Spalten "IDB" der beiden Tabellen. Ist da der Befehl "JOIN" der zentrale Befehl? Wo in Deinem Code wird der Ort 'Kassel' abgefragt? Als Ergebnis der Abfrage soll ja herauskommen:

Ort ............... Bundesland
Kassel .......... Hessen

Grüße,
Datenbeisser
 
Hallo akretscher,

die Datenbank mit Primary Keys besteht bereits.

Es geht nur um die Abfrage mit der Verknüpfung der Spalten "IDB" der beiden Tabellen. Ist da der Befehl "JOIN" der zentrale Befehl? Wo in Deinem Code wird der Ort 'Kassel' abgefragt? Als Ergebnis der Abfrage soll ja herauskommen:

Ort ............... Bundesland
Kassel .......... Hessen

Grüße,
Datenbeisser

Ich seh grad, ich hab die Bedeutung der Felder verdreht, und das konsequent durchgezogen:

Code:
test=# select * from codes ;
  idb  | bundesland
-------+------------
 DE.08 | Dresden
(1 row)

test=*# select * from daten ;
  ort  | idb | land
---------+-----+------
 Sachsen | 08  | DE
(1 row)

Deswegen dann auch:

Code:
test=*# select daten.ort, codes.bundesland from daten left join codes on (daten.land||'.'||daten.idb=codes.idb);
ort | bundesland
---------+------------
Sachsen | Dresden

Aber ansonsten hast Du Recht: JOIN ist hier zentral. Und Kassel wird weder abgefragt noch angezeigt, weil ich zu faul war & bin, das einzugeben.
 
Hallo akretschmer,

Beispiel 1 funktioniert nun bei mir einwandfrei:

SELECT Daten.Ort, Codes.Bundesland FROM Daten
LEFT JOIN Codes ON Data.IDB = Codes.IDB
WHERE Data.Ort == 'Kassel'

Und Beispiel 2 werde ich mit Deinem Code sicher auch noch hinbekommen:
(daten.land||'.'||daten.idb=codes.idb)

Vielen Dank für die Hilfe!

Grüße,
Datenbeisser
 
Beachte, daß || in MySQL was anderes ist als in PostgreSQL ;-)

Mmmh, meine Datenbank ist eine SQLite Datenbank und ich frage sie über die C-Schnittstelle aus einem Windows Programm ab. Die C-Funktionen können mit SQL Kommandos arbeiten, von deren Standardisierung ich bislang ausging. Der obengenante SQL Code für Beispiel 1 funktioniert jedenfalls einwandfrei. Zu Beispiel 2. bin ich noch nicht gekommen. Der "Join" Befehl war aber der entscheidende Hinweis. Deinen Code für Beispiel 2 werde ich daher wenn nötig vermutlich anpassen können.
 
Werbung:
Mmmh, meine Datenbank ist eine SQLite Datenbank
SQLite verhält sich deutlich ähnlicher zu den meisten anderen DBMS als MySQL. Oft kann ich SQL-Code zwischen SQLite und PostgreSQL beliebig hin und her schieben. Problematisch wird das erst wenn ich datenbankspezifische Funktionen benutze.

Ich kann dir außerdem empfehlen, eine Version ab 3.8.3 zu benutzen. Da wurden (Recursive) Common Table Expressions eingeführt. Aktuell ist 3.8.4.1.

In dieser Version wurde auch ein für dich möglicherweise relevantes Problem angegangen:
  • Work around a C-preprocessor macro conflict that breaks the build for some configurations with Microsoft Visual Studio.
 
Zurück
Oben