Soweit bin ich schon
Ich weiß nur nicht wie ich ihm in der WITH sagen soll die Belege in die Spalte einzufügen.Code:WITH belege AS ( SELECT * FROM foo2 WHERE "ID_Druck" = 1 OR "ID_Druck" = (SELECT max("ID_Druck") FROM foo2) OR 0 = round(mod("ID_Druck",5000)) ) INSERT INTO foo2 SELECT * FROM belege
Bekomm das mit INSERT TO nicht hin!
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Nu meckert Postgre weil ID_Druck type integer ist.
Habs in alle möglichen Zahlentypen umgewandelt, bringt aber nix
Mein Code soweit sieht ganz gut aus.. ich glaub ich versteh was du meinst AndreasCode:********** Fehler ********** FEHLER: Spalte »ID_Druck« hat Typ integer, aber der Ausdruck hat Typ character varying SQL Status:42804 Hinweis:Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen.
Code:WITH belege AS ( SELECT "BELEGE", 'Beleg' FROM foo WHERE "ID_Druck" = 1 OR "ID_Druck" = (SELECT max("ID_Druck") FROM foo) OR 0 = round(mod("ID_Druck",5000)) ) INSERT INTO foo SELECT * FROM belege;
Habs tatsächlich noch geschafft
Wenn ich bedenke wie umständlich die erste Abfrage warCode:WITH belege AS ( SELECT "ID_Druck", "LFDNR", 'Beleg' FROM foo WHERE "ID_Druck" = '1' OR "ID_Druck" = (SELECT max("ID_Druck") FROM foo) OR 0 = round(mod("ID_Druck",5000)) ) INSERT INTO foo SELECT * FROM belege;
Eins stört mich jedoch.
Da ich öfters mal bis zu 33 Spalten habe will ich nicht immer alle einzeln im SELECT aufführen.
Gibts da keine andere Möglichkeit? Oder eine Andere möglichkeit die Row "BELEGE" mit Belegen zu füllen.
Danke!
Geändert von truehumandesign (03.12.2011 um 00:06 Uhr)
Ich gebe mal eine Geschichte aus dem Alltag bei einem Hosting-Provider wieder:
Kunde hatte auf einer gut besuchten Seite sporadisch Fehlermeldungen. Und zwar konnte MySQL keine temp. Tabellen mehr anlegen. /var/tmp, wo dies erfolgte, war ca. 10 mal größer als die Größe aller MySQL-DBs zusammen.
Es stellte sich raus, daß da sinngemäß folgendes Select die Ursache war:
(das select war komplexer, ließ sich aber darauf reduzieren)Code:select einzelne_spalte from (select * from foo) where andere_spalte = N
foo war eine Tabelle mit einigen hundertausend Zeien, jede Zeile enthielt Dutzende langer Textfelder, also vielleicht 70 lange Felder. Die einzelne_spalte war ein INT, andere_spalte (Ziel des WHERE) war der PK von foo.
Aufgrund der hirnrissigen select * in der Klammer war MySQL genötigt, die komplette Tabelle als materialisierte temp. Tabelle zu erstellen. Laufzeit der Anfrage entsprechend.
*Eigentlich* wollte der Kunde das Problem mit Hardware erschlagen, sein Programmiere hätte ihm das vorgeschlagen. Ich hab ihm dann erklärt, was für ein *zensiert* dieser Programmierer ist.
Lerne: niemals select * in produktivem Code.
Andreas
Geändert von akretschmer (03.12.2011 um 09:38 Uhr)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Anderes Beispiel aus meiner Welt: wir machen "Big Data", sprich Data Warehousing.
Wenn du dort ein "SELECT *" machst, zwingst du die Datenbank, alle Spalten von der Platten zu lesen.
Im günstigsten Fall hast du pro Spalte eine Datei auf der Festplatte - durch die Angabe der einzelnen Spalten gewinnst du massiv an Performance.
Um akretschmer zu zitieren: niemals nie und nimmer mach ein "SELECT *".
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Ok das versteh ich jetzt endlich mit der Select * From abfrage!
Vielen Dank für die Hilfe!!
Da ich die Abfrage sowieso in ein Python Programm schreibe werde ich alle Spaltennamen über Variablen einfügen (somit ist es weniger Tipparbeit) und die Selektion erfolgt über einen GUI.
Gruß!
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen