PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL-Abfrage, die wohl nicht geht


c4
19.06.2003, 10:01:13
Moin,

hab 2 Tabellen, WFSNDBA_TAB_NEWS und WFSNDBA_TAB_NEWS2. In der WFSNDBA_TAB_NEWS sind alle Daten und einer kurzer Text zu der News drin. In WFSNDBA_TAB_NEWS2 ist der komplette Text drin (LANGTEXT) - das musste irgendwann mal so gelöst werden -> egal. Jetzt sollen die Daten aus WFSNDBA_TAB_NEWS2.LANGTEXT in das neue Feld WFSNDBA_TAB_NEWS.LANGTEXT übertragen werden. Natürlich muss der Text bei der richtigen News landen (NEWSID). Ich hatte eigentlich gedacht, dass man das mittels einer Abfrage lösen kann, dem scheint aber nicht so zu sein. 2 Ideen: UPDATE WFSNDBA_TAB_NEWS.*, WFSNDBA_TAB_NEWS2.*
SET WFSNDBA_TAB_NEWS.LANGTEXT=WFSNDBA_TAB_NEWS2.LANGTEXT
WHERE WFSNDBA_TAB_NEWS.NEWSID=WFSNDBA_TAB_NEWS2.NEWSID
// Fehlermeldung
// You have an error in your SQL syntax near ' WFSNDBA_TAB_NEWS2
// SET WFSNDBA_TAB_NEWS.LANGTEXT=WFSNDBA_TAB_NEWS2.LANGTEXT
// WH' at line 1

UPDATE WFSNDBA_TAB_NEWS INNER JOIN WFSNDBA_TAB_NEWS2
ON WFSNDBA_TAB_NEWS.NEWSID=WFSNDBA_TAB_NEWS2.NEWSID
SET WFSNDBA_TAB_NEWS.LANGTEXT=WFSNDBA_TAB_NEWS2.LANGTEXT
// Fehlermeldung:
// You have an error in your SQL syntax near 'INNER JOIN WFSNDBA_TAB_NEWS2
// ON WFSNDBA_TAB_NEWS.NEWSID=WFSNDBA_TAB_NEWS2.NEWSI' at line 1
Hat jemand Ideen, wie das gehen könnte?

Werde es nun aber doch mit PHP/mySQL lösen, geht schneller, als dieses ewige Denken... ;)

MiH
19.06.2003, 13:09:41
insert into WFSNDBA_TAB_NEWS (langtext) select langtext from WFSNDBA_TAB_NEWS2

http://www.mysql.com/doc/en/INSERT_SELECT.html

c4
19.06.2003, 13:17:10
Geht nicht, da wie gesagt schon Daten in der NEWS sind und der Text in das Feld LANGTEXT hinzugefügt werden sollte. Es muss also was mit UPDATE sein.

sigrun
19.06.2003, 22:59:50
Da du den UPDATE-Befehl nimmst, gehe ich also davon aus, dass

1. es gleichlautende Datensätze in beiden Tabellen gibt und
2. in der Tabelle WFSNDBA_TAB_NEWS bereits die Spalte "Langtext" existiert, sie nur entweder leer ist oder mit den Daten aus der anderen Tabellenspalte aktualisiert werden soll.

Versuch es mal so: Nach dem UPDATE-Befehl nur die Tabelle nennen, bei der der Datensatz eingefügt werden soll:

UPDATE WFSNDBA_TAB_NEWS.*

SET WFSNDBA_TAB_NEWS.LANGTEXT=WFSNDBA_TAB_NEWS2.LANGTEXT

WHERE WFSNDBA_TAB_NEWS.NEWSID=WFSNDBA_TAB_NEWS2.NEWSID


Bin gespannt, ob die Fehlermeldung dann noch kommt!
Gruß von Sigrun

c4
20.06.2003, 07:17:21
Nee, das geht auch nicht. Dann kennt der die Tabelle WFSNDBA_TAB_NEWS2 nicht.

diver-network
20.06.2003, 15:03:21
Hi C4,

versuch mal folgende Query:

UPDATE WFSNDBA_TAB_NEWS.LANGTEXT
SET WFSNDBA_TAB_NEWS.LANGTEXT=WFSNDBA_TAB_NEWS2.LANGTEXT
WHERE WFSNDBA_TAB_NEWS.NEWSID=WFSNDBA_TAB_NEWS2.NEWSID

ACHTUNG: Diese ist noch nicht getestet, daher GANZ WICHTIG: Nur mit einer Kopie der Datenbank arbeiten!!

Ansonsten kannst Du versuchen, eine neue Datenbank bzw. Tabelle anzulegen, die die gleiche Struktur wie WFSNDBA_TAB_NEWS hat. In die kannst Du eventuell die Daten mit INSERT...SELECT eintragen. Danach Originaltabelle umbenennen (zur Sicherheit, falls doch noch Fehler da sind), neue Tabelle in richtigen Namen umbenennen und hoffen, daß alle Daten so sind, wie sie sein sollen.

HTH,

Andy Maurer

c4
20.06.2003, 15:10:15
Selbe Sache wie bei der Idee von Sigrun - der kennt WFSNDBA_TAB_NEWS2 nicht.

galle
20.06.2003, 16:04:52
hi c4,
und wenn du mit SELECT INTO OUTFILE und danach LOAD DATA INFILE arbeiten würdest ?
haste dit ma getestet ?
greetings,
Frank
; ))))))))))))))))))))

ps: nur sone idee :-)

c4
20.06.2003, 16:05:55
Was macht das?

galle
20.06.2003, 16:13:27
hi again,
also die befehele exportieren datensätze in eine textdatei und
fügen diese daten dann irgendwo anders ein.
näheres habe ich dir hier als erklärung zusammengestellt.



SELECT ... INTO OUTFILE 'datei'

schreibt die ausgewählten Zeilen in eine Datei.
Die Datei wird auf dem Server-Host erzeugt und darf nicht bereits bestehen
(das verhindert unter anderem, dass Datenbanktabellen und Dateien wie `/etc/passwd' zerstört werden).
Um diese Form von SELECT auszuführen zu können, benötigt man die file-Berechtigung auf dem Server-Host.
SELECT ... INTO OUTFILE ist hauptsächlich dafür vorgesehen,
um eine Tabelle auf der Server-Maschine schnell zu dumpen.

Wenn man die resultierende Datei auf einem anderen Host als dem Server-Host haben will,
kann man SELECT ... INTO OUTFILE nicht benutzen.
In diesem Fall sollte statt dessen ein Client-Programm wie mysqldump --tab
oder mysql -e "SELECT ..." > outfile benutzt werden, um die Datei zu erzeugen.

SELECT ... INTO OUTFILE ist das Gegenstück von LOAD DATA INFILE.

Befehl, um Daten aus einer Datenbank in eine Datei zu schreiben: SELECT ... INTO OUTFILE
Befehl, um die Datei zurück in die Datenbank zu lesen: LOAD DATA INFILE
Syntax der FIELDS- und LINES-Klauseln: für beide Befehle dieselbe
Beide Klauseln sind optional, aber FIELDS muss LINES vorangehen, wenn beide angegeben werden


Wenn SELECT ... INTO OUTFILE zusammen mit LOAD DATA INFILE benutzt wird, um Daten aus einer Datenbank
in eine Datei zu schreiben und dann die Datei später zurück in die Datenbank zu lesen, müssen die Optionen für die
Behandlung von Feldern und Zeilen für beide Befehle übereinstimmen. Ansonsten interpretiert LOAD DATA INFILE
die Inhalte der Datei nicht korrekt.

Beispiel: SELECT ... INTO OUTFILE, um eine Datei zu schreiben, deren Feldern durch Kommas begrenzt sind:

mysql> SELECT * INTO OUTFILE 'daten.txt'
FIELDS TERMINATED BY ','
FROM ...;
Um die Komma-begrenzte Datei wieder einzulesen, lautet das korrekte Statement:

mysql> LOAD DATA INFILE 'daten.txt' INTO TABLE tabelle2
FIELDS TERMINATED BY ',';


greetings,
; )))))))))))))))))

c4
20.06.2003, 16:18:26
Ahm. Gut zu wissen. So eine Art SQL-Dump also.

Aber auch das kann nicht klappen, da die Daten ja in einen bestehenden Datensatz eingefügt werden sollen. Ich bleibe mal dabei: Es muss was mit UPDATE sein - wenn es denn überhaupt geht....

diver-network
23.06.2003, 11:00:13
Hi C4,

sorry für meinen ersten Vorschlag, hatte nicht gesehen, daß sigrun den gleichen gemacht hat.

Mein anderer Vorschlag mit dem Umweg über eine neue Tabelle war so gemeint:

INSERT INTO neueTabelle(id,kurztext,langtext,<weitere Felder>)
SELECT wfs.newsid,wfs.kurztext,wfs2.langtext,<weitere Felder>
FROM WFSNDBA_TAB_NEWS AS wfs INNER JOIN WFSNDBA_TAB_NEWS2 AS wfs2
ON WFSNDBA_TAB_NEWS.NEWSID=WFSNDBA_TAB_NEWS2.NEWSID

Anschließend die TABELLE WFSNDBA_TAB_NEWS umbenennen, dann die Tabelle neueTabelle in WFSNDBA_TAB_NEWS umbenennen und Du hast die Felder von WFSNDBA_TAB_NEWS2 auch mit drin.

Wichtig ist halt, daß die Tabellenstruktur von der neuen Tabelle identisch ist mit WFSNDBA_TAB_NEWS in der endgültigen Fassung.

Hoffe, es klappt so.

Andy

c4
23.06.2003, 11:09:31
Tja, zum probieren ist es ja schon längst zu spät.

Muss allerdings sagen, dass Deine Variante einleuchtend und möglich aussieht. Probieren ist aber nicht mehr, da NEWS2 gekickt wurde....
So bleibt mir nur zu warten, wann ich mal wieder vor dem Problem stehe.

Danke trotzdem für die Idee.

diver-network
23.06.2003, 11:12:55
No Problem ;-)

Andy

schluebby
17.05.2007, 09:39:36
guten morgen,

ich hab ein ähnliches Problem.

Theorie:
Ich habe Tabelle 1 (t_user) und Tabelle 2 (t_gruppe). Möchte aus Tabelle 1 die Datensätze wählen, die auch den Kriterien in Tabelle 2 entsprechen und sie in Tabelle 3 (t_auswahl) kopieren.

Problem:
Die Select-Abfrage gibt mir via echo die richtigen Zeilen aus. Aber mit dem Insert klappt es leider nicht. Es wird nichts in Tabelle 3 gefügt.

Script:
$befehl = "INSERT INTO t_auswahl (id, name, gruppe, status, daten)
SELECT *
FROM t_user
INNER JOIN t_gruppe
ON ( t_auswahl.gruppe = t_gruppe.gruppe) WHERE t_gruppe.status < 0
;";


Kann mir wer folgen? Wäre super, das beschäftigt mich nämlich schon seit einiger Zeit.

feuervogel
17.05.2007, 09:57:45
fehlen vielleicht daten? oder gibt es einen fehler? wundersamer weise bleibt meine glaskugel dunkel.

ich denke mal, es gibt einen fehler, der dich darauf hinweist, dass es immer noch heißen muss:

INSERT INTO `tabelle` (`spalte1`,`spalte2`) VALUES ('wert1','wert2')

(zumindest ist das die insert-syntax, die du wohl anstrebst.

und was passiert, wenn dein subquery mehrere ergebnis-tupel liefert, weiß ich auch nicht.

schluebby
17.05.2007, 15:09:15
also bei einer ähnlichen abfrage mit zwei tabellen funktioniert es wunderbar.
und wie gesagt ohne insert stimmen die ausgegebenen werte.
eine fehlermeldung gibt es leider keine. es passiert einfach nichts. :(