Announcement

Collapse
No announcement yet.

Wie mit SQL: direkter DB-Zugriff auf ein Element möglich ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie mit SQL: direkter DB-Zugriff auf ein Element möglich ?

    Hallo allerseits,
    1)
    Man hat ein Feld (array) von integer-Zahlen. An das Feldende soll die Summe dieser Zahlen anfügen werden. Falls diese Summe schon in einer Zelle des Feldes vorkommt, soll sie nicht angefügt werden.
    Pseudocode:
    sum = 0;
    for(i=0, i<feld.length;i++){
    sum = sum + feld[i]
    feld.appendIfNotContain(sum);

    2) Dies will ich nun mit einer Datenbank machen.
    Die Tabelle dieser DB besteht nur aus einer Spalte.
    In der Tabelle werden Integer-Zahlen gespeichert.
    Jetzt will ich dort das Gleiche machen wie bei dem Feld oben.

    Frage1:
    Kann man auf die Tabelle durch einen Direktzugriff zugreifen wie z.B:
    tabelle[spalte][zeile] = ....
    oder wie wird das in SQL gemacht ?

    Frage2:
    Durch welchen SQL-Befehl kann man an das Ende eine Zahl anfügen, aber nur unter der Voraussetzung, daß diese nicht schon in der Tabelle vorkommt ?

    mfg
    Bh

  • #2
    So arbeitet man nicht mit Datenbanken.
    Dein Array ist in einer DB eine extra Tabelle. Diese enthält das Array und einen Key der aussagt, welche Elemente der Tabelle zu welchem Array gehören, sofern mehrere vorhanden sind.
    Damit kannst du dann arbeiten summieren usw.
    Man speichert nicht mehrere Daten (hier Integer) in einer Column. Wie willst du darauf zugreifen, diese auswerten?
    Aus diesem Grunde gibt es dafür auch keinen "SQL-Befehl"
    Christian

    Comment


    • #3
      Als Ergänzung zu Christian:
      SQL bzw. relationale Datenbanksysteme arbeiten mengenorientiert.
      Das bedeutet unter anderem in Deinem Fall (und grundsätzlich):
      es gibt kein Anfang
      es gibt kein Ende
      es gibt keine nächsten Zeilen

      Mit einer einzigen Spalte kannst Du da wenig machen, außer den Feldinhalt zu interpretieren (was man aber idR. nie macht)
      Wenn Du ein Array abbilden möchtest, das Direktzugriff erlaubt, musst Du die Array Dimensionen in der Tabelle unterbringen.
      Also z.B. für 2 dimensional:
      Code:
      create table ZweiDimArray (
      x Integer,
      y Integer,
      wert Varchar(100)
      )
      Analog oder abgewandelt für mehrdimensionale Arrays.

      In SQL arbeitet man natürlicher Weise gern ohne Indizes im Sinne eines Arrays, man nutzt statt dessen natürliche oder künstliche, aber eindeutige Schlüssel, die einen eindeutigen Zugriff auf die Daten erlauben. Klassischer Fall wäre eine Kundennummer, eine Bestellnummer oder eine Buchungsnummer.

      Reihenfolgen bildet man bei Bedarf jeweils für eine Ausgabe der Daten ab mittels Order By Clause. Das hat allerdings gar nichts mit einer direkten Adressierung eines Arrays (Arrayindex) zu tun. Ebenso hat ein Feldindex (oder Tabellenindex) in einer Datenbankd nichts mit einem Arrayindex zu tun. Das sind identische Begriffe für total unterschiedliche Sachverhalte.
      Gruß, defo

      Comment


      • #4
        Danke für eure Antworten. Das was ich will geht also nicht direkt.
        Trotzdem noch eine Frage:
        Durch welchen SQL-Befehl kann man einen Datensatz (bei mir besteht der Datensatz nur aus einer Zahl bzw. zusätzlich noch einem eindeutigen Schlüssel zur eindeutigen Identifizierung um für mich intern einen Arrayindex zu simulieren) in eine Tabelle einfügen, aber nur unter der Voraussetzung, daß diese Zahl nicht schon in der Tabelle vorkommt ?
        Gibt es dazu einen SQL-Befehl ?

        mfg
        Bh

        Comment


        • #5
          Das könnte so ungefähr aussehen:
          [highlight=SQL]
          insert into mytable -- Insert Befehl
          ( schlüsselfeld, anderesFeld1, anderesFeld2, ..weitere) -- Zielspalten
          select <schlüsselwert>, <Wert1>, <Wert2>, ..weitere) -- Werte bzw. Ausdrücke, die eingefügt werden sollen
          from myTable -- die Angabe einer Datenquelle ist möglich, aber nicht notwendig, jenachem woher die Daten kommen
          -- die genaue Syntax hängt auch von der verwendeten Datenbank ab
          where not exists (select 1 from myTable -- die Select Clause mit 1 als Indikator für (mindestens) 1 Datensatz vorhanden
          where schlüsselfeld = <schlüsselwert> -- die Bedingung: gibt es den Wert bereits?
          [/highlight]
          Zuletzt editiert von defo; 15.11.2016, 11:21.
          Gruß, defo

          Comment


          • #6
            Danke für dein Feedback,
            ich werde das nachher gleich ausprobieren.
            Leider hat sich noch ein kleines Problem ergeben.
            Ich will ja eindimesionale Felder simulieren, deren Zellen verschiedene Integer-Werte sein müssen.
            Dazu verwende ich 2 Spalten:
            Spalte1: Primärschlüssel
            Spalte2: Interger-Zahl mit UNIQUE
            Das geht so lange gut, bsi ich 2 _gleiche_ Zahlen einfügen will, z.B. 2 Mal die Zahl 3
            Er fügt zwar die zweite gleiche Zahl nicht ein, aber er zählt den Index (Primärschlüssel) hoch.
            Beispiel: Einfügen der Zahlen 3,3,5,8
            In der Tabelle ist dann:
            1,3
            3,5
            4,8

            Ich will aber, daß der Index um genau 1 nach oben gezählt wird:
            1,3
            2,5
            3,8

            Was muß ich dazu machen ?

            mfg
            Bh

            Comment


            • #7
              Ein technischer Schlüssel (hier Primärschlüssel) ist nicht für die Programmlogik (hier Index) zu verwenden.
              Also füge eine weitere Spalte Index ein oder bilde den Index beim auslesen der Daten aus der DB und Übernahme in ein Array
              Christian

              Comment


              • #8
                Originally posted by Christian Marquardt View Post
                Ein technischer Schlüssel (hier Primärschlüssel) ist nicht für die Programmlogik (hier Index) zu verwenden.
                Also füge eine weitere Spalte Index ein oder bilde den Index beim auslesen der Daten aus der DB und Übernahme in ein Array
                Hallo Christian,
                Danke für deine Antwort.
                Ich verstehe trotzdem nicht, daß obwohl die 3 nicht als Zahl eingefügt wird, der Primärschlüssel hochgezählt wird.
                Welche "Logik" steckt da dahinter ?

                mfg
                Bh

                Comment


                • #9
                  Der Primärschlüssel soll primär die Eindeutigkeit des Datensatzes garantieren, Lückenlosigkeit des Primärschlüssels hat da erstmal gar keinen zusätzlichen Wert. Ziehen eines neuen Wertes und einfügen in die Tabelle sind zwei unterscheidbare elementare Funktionen. Würde man garantieren wollen das nur benutzte Werte auch nicht mehr wiederverwendet werden müsste bis zum Abschließen der Transaktion der Generator der für diesen Wert benutzt wurde für andere Benutzer/Transaktionen gesperrt werden. Das hätte ausgesprochen schlechten Einfluss auf die allgemeine Datenbankperformance.

                  Beispielhafter ausgedrückt wenn die 3 als PK für diese Zeile generiert wird und bevor sie in der Zeile benutzt wird bzw. die dazugehörende Transaktion abgeschlossen wird können schon andere (Benutzer/Transaktionen) weitere Werte für ihren PK in dieser Tabelle angefordert haben. Also bevor du weißt ob die 3 auch tatsächlich benutzt wird haben andere möglicherweise schon die 4, 5, 6 usw. angefordert. Diese dann wiederum verworfen oder vielleicht bereits in die Tabelle eingetragen oder sie befinden sich noch im Flow ihrer Transaktion. Die 3 quasi wieder zurückzulegen um sie für einen andere Zeile zu benutzen ist mehr als problematisch ohne wie im ersten Satz angedeutet irgendeinen zusätzlichen Wert zu haben für das was ein PK eigentlich tun soll.

                  Comment

                  Working...
                  X