sql hilfe
hy leute,
also mein problem: ich habe 10 tabellen die ihre id (Primärschlüssel) zu einer "haupt" tabelle schicken sollen. (wenn etwas eingetragen wird)
benutzernamen werden auch an die haupttabelle geschickt.
ich möchte nun das jeder benutzer jede id der tabellen zugeordnet bekommt.
mein sql command:
"INSERT INTO Haupttabelle (Benutzerid FROM Benutzer.Benutzerid, Tableid FROM tabelle.tebellenid) "
habs auch so versucht
"INSERT INTO Haupttabelle (Benutzerid, Tabellenid) VALUES (Benutzer.Benutzerid, Tabelle.Tabellenid) "
geht leider nichts :(
bitte um eure hilfe
Antwort schreiben
Antwort 1 von disco vom 11.01.2019, 09:20 Options
moin
du hast da einen ziemlich großen denkfehler.
Benutzer.Benutzerid und Tabelle.Tabellenid sind bezeichnungen ganzer spalen einer tabelle und nicht der inhalt einer einer zelle, bzw. ein wert. du gibst also nicht an welchen wert (fremdschlüssel) du eintragen möchtest.
kurz du musst richtige werte angeben
"INSERT INTO Haupttabelle (Benutzerid, Tabellenid) VALUES ("0815", "20005") "
natürlich sollten diese werte aus variablen (je nach programmoersprache kommen)
g,
disco
Hallo,
richtig müsste das so aussehen:
INSERT INTO Haupttabelle (Select a.Benutzerid, b.Tableid FROM Benutzer a, tabelle b)
(a und b könne frei gewählt werden)
das Einschreiben der Daten würde ich über einen ON INSERT -Trigger realisieren das Ändern dann mit einem ON UPDATE Trigger.
Welches DB-System nutzt du eigentlich? Da kann ich dann etwas näher drauf eingehen.
MfG
b1n4ry0utl4w
Antwort 3 von isset vom 11.01.2019, 09:39 Options
hmmm, hast recht ; )
nur, wie soll ich das dann automatisieren????
ich kann ja nicht (es gibt 30 user)
30 mal hintereinander einen insert befehl ausführen sodas name in die tabelle eingefügt wird :(
Antwort 4 von isset vom 11.01.2019, 09:39 Options
außerdem thx für unterstützung
Hallo,
mit diesem Befehl werden alle Benutzer und Tabellen miteinander verknüpft und reingeschrieben (also genau das was du willst). Du kannst die Unterabfrage auch variieren (also einzeln testen was rauskommt und dann noch WHERE-Bedingung,... hinzufügen).
MfG
b1n4ry0utl4w
PS: Du hast immer noch nicht dein DB-System gesagt
Antwort 6 von isset vom 11.01.2019, 10:16 Options
also es ist eine orakel db.
lg isset
Hallo,
dann schau mal
hier . Das ist bei Oracle nicht ganz so trivial, Aber die Trigger funktionieren so wie ich gesagt habe.
MfG
b1n4ry0utl4w
Antwort 8 von isset vom 11.01.2019, 11:03 Options
k, thx einmal jetzt funkt di abfrage mit select
INSERT INTO Anzeigen (Select a.Benutzerid, b.Kraftwid FROM Benutzer a, Kraftwerk b )
aber einfügen kann ich noch immer keine daten :( irgendwie komisch oder???
Hallo,
was passiert wenn du die komplette Abfrage ausführst,also:
INSERT INTO Anzeigen Select a.Benutzerid, b.Kraftwid FROM Benutzer a, Kraftwerk b
?
Fehlermeldung, o.ä.? Schreibt er gar nix in die Tabelle oder was falsches?
MfG
b1n4ry0utl4w
Antwort 10 von isset vom 11.01.2019, 11:12 Options
es kommt immer ORA 00947 not enough values
Hallo,
du hast mehr als 2 Spalten in der Tabelle Anzeigen, das wusste ich nicht. Der richtige Code müsste heißen:
INSERT INTO Anzeigen(Benutzerid,Kraftwid) Select a.Benutzerid, b.Kraftwid FROM Benutzer a, Kraftwerk b
MfG
b1n4ry0utl4w
Antwort 12 von isset vom 11.01.2019, 11:20 Options
hey alter du hast es echt drauf :)
1000 dank
es funktioniert
Antwort 13 von isset vom 11.01.2019, 11:27 Options
falls es dich noch interessiert hab noch bedingung hinzugefügt (KwVar ist eine Variabel damit ich nur neue Beiträge hinzufüge)
INSERT INTO Anzeigen(Benutzerid,Tableid) Select a.Benutzerid, b.Kraftwid FROM Benutzer a, Kraftwerk b WHERE b.Kraftwid = ´" & KwVar & "´"
nochmals thx
Antwort 14 von gamex vom 11.01.2019, 12:15 Options
Nur so eine kleine Anmerkung... der SELECT-Befehl für das INSERT-Statement wird wahrscheinlich zu viele Werte liefern. Der liefert nämlich alle Kombinationen von Benutzer.Benutzerid und Kraftwerk.Kraftwerkid.
Bsp.:
Benutzer enthält die BenutzerIds 1,2,3
Kraftwerk enthält die KraftwerkIds 10,11,12
Der Select-Befehl liefert dann folgende Datensätze:
[1,10]
[1,11]
[1,12]
[2,10]
[2,11]
[2,12]
[3,10]
[3,11]
[3,12]
...also bereits 9 Datensätze, obwohl davon sicherlich nicht alle Sinn machen, schließlich hat nur ein Benutzer die neue Kraftwerk-ID angelegt. Außerdem will ich ja bei einem Trigger-Ereignis nur die neu angelegte ID eintragen.
Selbst die Einschränkung mittels
WHERE b.Kraftwid = ´" & KwVar & "´"
liefert noch zu viele Datensätze, denn es wird dennoch für jeden Benutzer ein Eintrag in der Haupttabelle gespeichert.
Meine bescheidene Meinung: die BenutzerId für das Insert-Statement muss von der Anwendung kommen (die den Login o.ä. durchgeführt hat), denn nur dort ist die richtige BenutzerId bekannt. Die neueste ID könnte z.B. per Max(KraftwerkId) abgefragt werden, falls das ein Auto-Increment ist.
Dennoch frage ich mich, warum man eine Spalte haben will, in der alle jemals eingefügten IDs anderer Tabellen drin sind. Macht nur Sinn, wenn ich pro Fremd-Tabelle eine Spalte habe (denn was nutzt mir die Info "12", wenn ich nicht weiß, welche Tabelle gemeint ist) oder pro Fremdtabelle genau eine Zeile.
P.S.: Ich hoffe, die Kraftwerk-Id ist jetzt kein Atomkraftwerk, dessen Sicherheitssystem über o.a. SQL-Befehle gesteuert wird...
Antwort 15 von isset vom 11.01.2019, 12:44 Options
:) nein ist kein atomkraftwerk, :)
ich kann dir mein problem erläutern:
also ich hab wie du schon richtig vermutet hast ein login system mit 30 user. es gibt insgesammt 10 tabellen zb kraftwerk in der daten abgelegt sind.
wenn eine datei abgespeichert wird müssen andere user diesen beitrag lesen und über einen button eine lese bestätigung durchführen so das zu 100% sicherheit jeder user weiß um welchen eintrag es sich handelt. (um missverständnisse zu beseitigen)
dadurch das jeder benutzer jeden eintrag bestätigen muss ist mir leider nur diese eine möglichkeit in den sinn gekommen. sie ist zwar nicht elegant aber sie funktioniert :)
falls du verbesserungsvorschläge oder eine andere idee hast nur zu :)
ich mach sowas nämlich zum ersten mal
lg isset
Antwort 16 von isset vom 17.01.2019, 08:33 Options
hy,
ich hab nun folgendes problem, da di ids aus den unterschiedlichen tabellen gleich sind kann ich gewisse lesevorgänge nicht mehr durchführen da mein programm nicht mehr weiß aus welcher tabelle der eintrag stammt.
ich habe nun noch eine 3. spalte in anzeigen eingefügt. hier soll der name der tabelle plaziert werden, könnte mir wer mit mysql befehl helfen?????
alter text:
.CommandText = "INSERT INTO Anzeigen(Benutzerid,Tableid) Select a.Benutzerid, b.Kraftwid FROM Benutzer a, Kraftwerk b
es sollte halt bei dem ergbnis mit diesen command text noch die spalte tbn mit "kraftwerk" gefüllt werden