SQLite Update - Alle Zellen gleiche Zahl?

TheSaint

Benutzer
Beiträge
6
Hallo,

ich grüble schon seit Stunden bzw. Tagen über folgendes Problem.
Vielleicht kann mir jemand sagen wo ich etwas falsch mache:

Ich nutze SQLite als Datenbank.

Code:
UPDATE BUCHUNG
SET Konto = (SELECT Distinct (ZAEHLER.ID + 10000)
  FROM  ZAEHLER
  INNER JOIN BUCHUNG
  ON (BUCHUNG.KS = ZAEHLER.NR)
  AND (BUCHUNG.OBJ = ZAEHLER.OBJNR))
  WHERE BUCHUNG.KS >= 100000;

Hierbei wird die Spalte Konto immer mit der ersten gefundenen Zaehler.id gefüllt.
Es müssten aber unterschiedliche Zaehler.id eingetragen werden.
Ich habe den Select Befehl einzeln ausgeführt. Der ist O.K.
Also ich komme einfach nicht mehr weiter.
Könnte mir jemand hierbei helfen?

Vielen Dank und viele Grüße
Michael
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.528
Hallo,

ich grüble schon seit Stunden bzw. Tagen über folgendes Problem.
Vielleicht kann mir jemand sagen wo ich etwas falsch mache:

Ich nutze SQLite als Datenbank.

Code:
UPDATE BUCHUNG
SET Konto = (SELECT Distinct (ZAEHLER.ID + 10000)
  FROM  ZAEHLER
  INNER JOIN BUCHUNG
  ON (BUCHUNG.KS = ZAEHLER.NR)
  AND (BUCHUNG.OBJ = ZAEHLER.OBJNR))
  WHERE BUCHUNG.KS >= 100000;

Hierbei wird die Spalte Konto immer mit der ersten gefundenen Zaehler.id gefüllt.
Es müssten aber unterschiedliche Zaehler.id eingetragen werden.
Ich habe den Select Befehl einzeln ausgeführt. Der ist O.K.
Also ich komme einfach nicht mehr weiter.
Könnte mir jemand hierbei helfen?

Vielen Dank und viele Grüße
Michael


Reverse die Tabellen zu erraten ist immer so ein Ding... Dir fehlt eine Bedingung, welches Konto auf welchen Wert gesetzt werden soll. Dazu müßte Dein Subselect nicht nur eine Reihe von Werten in einer Spalte liefern (das macht es derzeit wahrscheinlich), sondern auch eine Verbindung zum Primary key der Tabelle buchung.

Also, Du hast jetzt:

Code:
test=*# select * from t1;
 id | val
----+-----
  1 |
  2 |
  3 |
(3 rows)

Time: 0,182 ms
test=*# select * from t2;
 id | val
----+-----
  1 |  10
  2 |  20
  3 |  30
(3 rows)

Dein select liefert sowas wie:

Code:
test=*# select distinct (val) from t2;
 val
-----
  30
  20
  10
(3 rows)

Und alles zusammen sollte eigentlich sogar ein Fehler kommen:

Code:
test=*# update t1 set val = (select distinct val from t2) ;
ERROR:  more than one row returned by a subquery used as an expression

Richtig wäre:

Code:
test=*# update t1 set val = foo.val from (select id, val from t2) foo where t1.id=foo.id;
UPDATE 3
Time: 0,311 ms
test=*# select * from t1;
 id | val
----+-----
  1 |  10
  2 |  20
  3 |  30
(3 rows)

Oder hab ich Dich falsch verstanden? Falls ja: liefere bitte Tabellenaufbau, Inhalt und gewünschtes Resultat.


Andreas
 

TheSaint

Benutzer
Beiträge
6
Richtig wäre:

Code:
test=*# update t1 set val = foo.val from (select id, val from t2) foo where t1.id=foo.id;
UPDATE 3
Time: 0,311 ms
test=*# select * from t1;
id | val
----+-----
  1 |  10
  2 |  20
  3 |  30
(3 rows)

Oder hab ich Dich falsch verstanden? Falls ja: liefere bitte Tabellenaufbau, Inhalt und gewünschtes Resultat.


Andreas

Hallo Andreas,

vielen Dank für Deine Antwort. Wow.
Ja, genau das Ergebnis suche ich.
Die Select Abfrage ergibt das von Dir gezeigte Ergebnis.
Jedoch kommt keine Fehlermeldung.
Wie bekomme ich es den in SQLite hin, dass o. g. Ergebnis
in den Tabellen eingetragen wird?
Habe das Gefühl, dass SQLite das nicht kann?

Viele Grüße
Michael
 

akretschmer

Datenbank-Guru
Beiträge
9.528
Hallo Andreas,

vielen Dank für Deine Antwort. Wow.
Ja, genau das Ergebnis suche ich.
Die Select Abfrage ergibt das von Dir gezeigte Ergebnis.
Jedoch kommt keine Fehlermeldung.
Wie bekomme ich es den in SQLite hin, dass o. g. Ergebnis
in den Tabellen eingetragen wird?
Habe das Gefühl, dass SQLite das nicht kann?

Viele Grüße
Michael

Wenn da keine Fehlermeldung kommt ist das IMHO ein Bug. Das ist ungefähr MySQL-Niveau ;-)

Ändere Deine Abfrage so um wie ich das gemacht habe. Innerhalb der Klammern von "...from (select id, val from t2) foo ..." setzt Du ein Select, was Dir 2 Spalten liefert: einmal einen Schlüssel, mit dem Du in der anderen Tabelle den richtigen Datensatz findest (idealerweise den PK) und den Wert, der gesetzt werden soll. Ich bin mir recht sicher, daß SQLite das kann, obwohl ich natürlich auch gern PG anpreise ;-)

Andreas
 

TheSaint

Benutzer
Beiträge
6
Wenn da keine Fehlermeldung kommt ist das IMHO ein Bug. Das ist ungefähr MySQL-Niveau ;-)

Ändere Deine Abfrage so um wie ich das gemacht habe. Innerhalb der Klammern von "...from (select id, val from t2) foo ..." setzt Du ein Select, was Dir 2 Spalten liefert: einmal einen Schlüssel, mit dem Du in der anderen Tabelle den richtigen Datensatz findest (idealerweise den PK) und den Wert, der gesetzt werden soll. Ich bin mir recht sicher, daß SQLite das kann, obwohl ich natürlich auch gern PG anpreise ;-)

Andreas

Hallo Andreas,

danke für Deine schnelle Info.
Ich habe gerade versucht mit Deinem SQL Befehl zu arbeiten.
Jedoch gibt SQLite sofort Fehlermeldungen raus.
Der Aufbau des SQL - Befehles für SQLite krieg ich einfach nicht hin.
Kennst Du Dich mit SQLite etwas aus? Könntest Du mir hierbei helfen?

Vielen Dank
Michael
 

akretschmer

Datenbank-Guru
Beiträge
9.528
Hallo Andreas,

danke für Deine schnelle Info.

Bitte.

Ich habe gerade versucht mit Deinem SQL Befehl zu arbeiten.
Jedoch gibt SQLite sofort Fehlermeldungen raus.
sind die geheim?

Der Aufbau des SQL - Befehles für SQLite krieg ich einfach nicht hin.
Kennst Du Dich mit SQLite etwas aus?
Nein, nie benutzt.

Könntest Du mir hierbei helfen?

Ähm, tue ich das nicht die ganze Zeit? ;-)


Andreas
 

TheSaint

Benutzer
Beiträge
6
Hallo Andreas,

ja, Du hilfst mir schon die ganze Zeit :).
Die erbetene Hilfe betraf den SQLite Befehlsaufbau.
Als ich deinen Befehlsaufbau übernommen habe, kam
sofort eine Fehlermeldung: (Fehler in der Nähe von: "FROM")
und keine weitere Beschreibung des Fehlers.

Zur Zeit versuche ich den Befehl neu aufzubauen.

Nochmals vielen Dank für Deine Erläuterung und Hilfe.

Viele Grüße
Michael
 

TheSaint

Benutzer
Beiträge
6
Hallo Andreas,

komme einfach nicht dahinter, wie ich diesen Befehl aufbauen soll,
damit es in SQLite funktioniert.
Kannst Du vielleicht noch mal schauen ob Du es hinbekommst?

Vielen Dank im Voraus.
Michael
 

TheSaint

Benutzer
Beiträge
6
Wenn da keine Fehlermeldung kommt ist das IMHO ein Bug. Das ist ungefähr MySQL-Niveau ;-)

... obwohl ich natürlich auch gern PG anpreise ;-)

Andreas

Hallo Andreas,

ich benutze VB2010.
Komme hiermit gerne auf deinen Vorschlag bezüglich PostgreSQL zurück.
Könntest Du mir bitte sagen, welche Software ich herunterladen muss und
welche DLL ich verwenden muss, damit ich PostgreSQL in VB2010
nutzen kann? Evtl. einen Einstieg wie ich auf eine PostgreSQL Datenbank
mit VB2010 zugreifen und bearbeiten kann?

Würde mich riesig freuen.

Schon mal vielen Dank und viele Grüße
Michael
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.528
Hallo Andreas,

ich benutze VB2010.
Komme hiermit gerne auf deinen Vorschlag bezüglich PostgreSQL zurück.
Könntest Du mir bitte sagen, welche Software ich herunterladen muss und
welche DLL ich verwenden muss, damit ich PostgreSQL in VB2010
nutzen kann? Evtl. einen Einstieg wie ich auf eine PostgreSQL Datenbank
mit VB2010 zugreifen und bearbeiten kann?

Ich kann Dir mit Microsoft-Gedöhns nicht helfen, aber google mal nach "postgresql visual basic".

Andreas
 
Oben