Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQLite Update - Alle Zellen gleiche Zahl?

Dieses Thema im Forum "SQLite" wurde erstellt von TheSaint, 19 März 2013.

  1. TheSaint

    TheSaint Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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
     
  3. TheSaint

    TheSaint Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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
     
  5. TheSaint

    TheSaint Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Bitte.

    sind die geheim?

    Nein, nie benutzt.

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


    Andreas
     
  7. TheSaint

    TheSaint Benutzer

    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
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Ist ja schön, daß Du das gleich 2mal schreibst. Alternativ kann man Beiträge auch mit 'Gefällt mir' kennzeichnen ;-)

    Andreas
     
    TheSaint gefällt das.
  9. TheSaint

    TheSaint Benutzer

    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
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Vielleicht.

    Dazu wäre aber ein 'CREATE TABLE ...' sehr hilfreich. Aber nicht mehr heute.
     
  11. TheSaint

    TheSaint Benutzer

    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
     
  12. akretschmer

    akretschmer Datenbank-Guru

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

    Andreas
     
    TheSaint gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden