ich hab mal wieder ein pgProblem. Und zwar würde ich gerne in pg eine Insert-Abfrage ausführen, die sich Daten aus einer anderen DB (SQL Server) auf einem anderen Rechner holt.
In Access kann man ja “fremde” Tabellen über ODBC einbinden oder mit pass-through-Abfragen direkt Daten daraus holen. Geht sowas auch mit pg?
aus der fremden DB mit deren tools in eine CSV datei zu exportieren
und mit copy in postgres zu importieren
ms-query versteht es leider nicht spalten und tabellen-namen zu quoten, was u.U’. notwendig ist, wenn man nicht alle namen klein geschrieben hat oder irgendwer keywords als namen verwendet hat. daher ist es sehr wahrscheinlich dass du mit MS tools auf PG server nicht sehr weit kommst, wenn du das modell nciht selbst in der hand hast
Problem ist nur, daß die Tabelle in der fremden DB eine ID-Spalte hat und dann noch 100 Spalten mit Werten von 100 Merkmalen. In der pg-Tabelle hab ich nur 3 Spalten: ID-Spalte, Merkmal-Spalte und Wert-Spalte.
Mein Plan war jetzt eine SQL-Abfrage:
DELETE FROM ONLY pgdaten;
INSERT INTO pgdaten
SELECT fremddaten.ID, Merk1, fremddaten.Merk1
FROM fremddaten
WHERE fremddaten.Merk1 is not null;
INSERT INTO pgdaten
SELECT fremddaten.ID, Merk2, fremddaten.Merk2
FROM fremddaten
WHERE fremddaten.Merk2 is not null;
usw. bis Merk100.
Da ich diesen Datenabgleich mehrmals wöchentlich machen muss, wäre das einfacher wie jedesmal in csv exportieren und dann mit copy einlesen. Noch dazu wüsste ich gar nicht, wie ich bei copy einzelne Spalten auswählen kann und leere Werte nicht mit einlesen.
der wird dir dann sagen, dass du auch 100 spalten mit id importieren kannst (mit copy) in eine import-tabelle und dann diese aufbereiten - z.B. mit trigger… ich hatte kuerzlich das gleiche problem - hab nen trigger auf die tabelle gebaut, BEFoRE INSERT die der import-Table selbst NULL liefert, was dazu fuehrt dass in dieser in wirklich keine saetze eingefuegt werden, aber der trigger pickt sich die rosinen-spalten aus der row raus und INSERTED diese in die tatsaechliche wunschtraum-tabelle mit den 3 spalten bei dir.
das gute an diese bulk copies ist ja, dass sie wirklich wirklich wirklich sehr schnell sind - mein 1/2 GB (280 spalten * 360k zeilen) schaffte das gute PG in ein bisschen mehr als 20 min auf nem durchschnittlichen PC
(mit dieser beschriebenen trigger-variante und nem schnoeden - dort bremsenden index)
Danke nochmal für eure Tipps. Läuft jetzt einwandfrei mit dem copy Befehl. Am längsten dauert es das csv-File (15MB) durchs Netz zu hämmern. Aber das Problem hätte ich ja auch mit einer direkten pass-through Abfrage. Der Rest ist dann wirklich rasend schnell.