Abfrage einer relationalen DB

Hallo zusammen,

Ich muss für ein Schulprojekt eine Datenbank mit PostgreSQL erstellen.
Dafür habe ich in meiner Datenbank ein neues Schema erstellt.
Dieses Schema beinhaltet drei Tabellen: Schulzimmer, Schueler und SchuelerZimmer.

Die Tabellen haben folgende Attribute.

Schulzimmer

id
stock
zimmerNummer



Schueler

id
name
vorname
schuelerzimmerID



SchuelerZimmer

id
schulzimmerID
schuelerZimmerID

Ein Schüler hat in einem oder mehreren zimmern Unterricht.
Pro Zimmer hat mindestens ein oder mehrere Schüler Unterricht.

Nun wenn ich folgende Abfrage mache:

SELECT a.name, a.vorname, b.stock, b.zimmerNummer
FROM schueler a, Schulzimmer b
WHERE a.schuelerzimmerID IN (SELECT id from schuelerZimmer WHERE schuelerZimmerID = a.id AND schuelerZimmerID = b.id)

Dabei erhalte ich diesen Fehler:

FEHLER: Spalte a.schuelerzimmerID existiert nicht
SQL state: 42703
Hint: Vielleicht wurde beabsichtigt, auf die Spalte „a.schuelerzimmerID “ zu verweisen.

Danach muss ich die Abfrage so umschreiben, damit es funktioniert.

SELECT a.name, a.vorname, b.stock, b.zimmerNummer
FROM schueler a, Schulzimmer b
WHERE a."schuelerzimmerID" IN (SELECT "id" from "schuelerZimmer" WHERE "schuelerZimmerID" = a.id AND "schuelerZimmerID" = b.id)

Meine Frage, ist das Normal oder habe ich irgendwo einen Fehler gemacht. So einen Fehler habe ich noch nie gesehen.

PostgreSQL ist prinzipiell erst einmal die Groß- oder Kleinschreibung egal, es sei denn, Du gibst bei der Erstellung das expliziet vor. Wenn Du PGAdmin verwendest, macht dies, soweit ich weiß, dies automatisch. Dann mußt Du damit ‘leben’, immer die felder in " zu setzen.

PS.: versuche Dir anzugewöhnen, expliziete Join-Syntax zu verwenden. Also nicht ‘… from table_a, table_b where …’ sondern ‘… from table_a LEFT JOIN table_b ON …’ etc. Das ist deutlich besser lesbar und wartbar später.

Danke für deine Antwort.
Jedoch bin ich verwirrt, da ich dies nur hier machen muss.

Bei anderen Abfragen, muss ich die Felder nicht in “” machen.

Es kommt darauf an, mit welcher Syntax du die Tabellen und Spalten erstellt hast.

Es ist ein Unterschied ob mit

create table NameTest ( TestId integer);

oder mit

create table "NameTest" ( "TestId" integer);

Bei der ersten Variante (ohne Anführungszeichen) werden die Namen in Kleinbuchstaben konvertiert und im Data Dictionary abgelegt. Mit Anführungszeichen wird die exakte Schreibweise genommen.
Das gilt dann auch bei der Verwendung. Ohne Anführungszeichen wird immer in Kleinbuchstaben konvertiert und dann im Data Dictionary (Definition) nachgeschaut. Mit Anführungszeichen muss die Schreibweise exakt zur Definition passen.

Genial Danke! Nun habe ich verstanden, wo mein Fehler lag.