Problem beim Einfügen von Tupeln

Hallo Leute,

also die Aufgabe lautet:
Alle Mitarbeiter der Produktionsabteilung sollen ab sofort mit 10% ihrer Arbeitszeit im Projekt 6 mitarbeiten, die Stundenzahl ist zunächst unbekannt.

Ich dachte es mir irgendwie so in der Art
INSERT INTO MITARB VALUES (6, (SELECT PNR FROM PERS WHERE ANR = 55), 10, NULL )
Aber da ich ja bei dem SELECT eine Menge zurückbekomm geht das nicht.
Aber selbst manuell ablesen welche mitarbeiter gemeint sind kann ja net die Lösung sein.

MITARB=(JNR, PNR, ZEITANTEIL, STUNDEN)
ABT=(ANR, ANAME)

Na ja, aller Anfang ist schwer :o)
also bitte helft mir.

Gruß Michael

Hallo

select max(pnr) from pers…

und schon klappts.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ja nun kommt zwar kein Fehler mehr aber das beantwortet ja nicht die Frage, schließlich sollen alle Mitarbeiter der Abteilung und nicht nur der mit der größten PNR(Personalnummer) angesprochen werden.

Gruß Michael

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Du willst einen Masseninsert? So wie du die Frage gestellt hattest, ging ich davon aus, dass du eh über den Schlüssel selktierst.

Dann gehts so:

INSERT INTO MITARB (SELECT 6, PNR, 10, null FROM PERS WHERE ANR = 55);

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Peter, hallo Michael,

Tut immer gut, wenn man einen Prof schulmeistern kann :wink:

INSERT INTO MITARB (SELECT 6, PNR, 10, null FROM PERS WHERE
ANR = 55);

Sollte so erweitert werden:

INSERT INTO MITARB (JNR, PNR, ZEITANTEIL, STUNDEN)
 (SELECT 6, PNR, 10, null 
 FROM PERS WHERE ANR = 55);

Der Grund ist schlicht und einfach, dass
a) du dann die Tabelle erweitern kannst, ohne dass du deinen INSERT umschreiben musst (zumindest wenn die neuen Spalten auch NULL enthalten dürfen) und dass
b) Die Reihenfolge der Spalten nicht auf jeder Datenbank, mit der du arbeitest zwangsläufig gleich sein muss (könnte zum Beispiel entstanden sein, weil in der einen DB die Tabelle mit allen Feldern wie in der obigen Reihenfolge angelegt wurde, während die andere DB ein Update von einer früheren Version ist, wo die Spalte ZEITANTEIL nachträglich per ALTER TABLE eingefügt wurde und daher jetzt ganz hinten steht).
Insgesamt gilt es als schlechter Stil, sich auf Anzahl und Reihenfolge von Spalten zu verlassen, weil es die Wart- und Erweiterbarkeit des Programms negativ beeinflusst.
Gleiches gilt übrigens auch für „SELECT * FROM my_tab…“

Gruß
Martin

1 Like

Jaaaaaaaa gibs mir.

Streu Salz in die Wunden. Schließlich verlang ich ja auch genau deine Syntax in meinen Klausuren!

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Martin!

INSERT INTO MEIN\_SCHEMA.MITARB (JNR, PNR,ZEITANTEIL, STUNDEN)
SELECT 6, PNR, 10, null
 FROM MEIN\_SCHEMA.PERS
WHERE ANR = 55;

Ich laß die Klammern auch gleich weg, erspart mindestens 1/4 Sekunde Tipparbeit …

Und um das Ganze noch abzurunden, sollte man noch das Schema dazuschreiben oder zumindest der Hinweis gegeben sein, daß es sich um ein Synonym handelt, damit auch die Schemas auf verschiedenen Instanzen frei vergeben werden können …

Grüße,
Tomh

Pui, die Oraceler sind wieder mal pingelig in letzter Zeit …