Kopfzerbrechen für mich, 2 Minuten Arbeit für Dich!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kopfzerbrechen für mich, 2 Minuten Arbeit für Dich!

    Als absoluter Anfänger brauche ich eure Hilfe, ein schicken SQL-Code...

    Folgendes Problem:

    Es gibt 3 Tabellen mit jeweils 3 Spalten. Nun soll mit einer Abfrage verglichen werden, ob Inhalte (keine fest definierten) von Tabelle1, Spalte1 mit Tabelle2, Spalte1 übereinstimmen....

    Wenn Treffer, dann soll die komplette Zeile aus Tabelle1 in Tabelle3 geschrieben werden, sollten Inhalte in Tabelle1 vorhanden sein, welche nicht in Tabelle2 auftreten, dann wieder die Zeile aus Tabelle1 in Tabelle3 hinzufügen. Sollten Inhalte in Tabelle2 vorhanden sein, welche nicht in Tabelle1 waren, dann diese auch zu Tabelle3 hinzufügen.



    Vielen Dank im vorraus
    calimero

  • #2
    mal kurz ne zwischenfrage.....

    warum kopierst du die tabellen nicht einfach mit phpmyadmin?

    ok. und jetzt erkläre mal bitte genau, was du vor hast und welchen sinn diese copy-aktion haben soll. kann ja sein, dass da ein grund dahinter steckt, aber das geht bestimmt auch einfacher.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      phpmyadmin? sorry, bin aber absoluter laie....nie mit gearbeitet

      erkläre mal bitte genau
      Okidoki:

      kurzer Hintergrund:
      Hardware ist mit Barcode versehen. Mit Barcodescanner tut man so einiges einscannen, am Ende generiert der Scanner eine .dat, die dann am SQL in eine Tabelle geschrieben wird.

      Die Tabelle hat folgende Spalten:
      Spalte1: SN (Seriennummer)
      Spalte2: Ort (Einsatzort)
      Spalte3: Datum (iss schon klar...)

      Hab halt einen MSSQL - Will nun ein DTS-Packet erstellen, welches halt zu einer bestimmten Zeit automatisch abläuft. Das ich jetzt so ein paar Denkfehler raushaue, ist nicht auszuschliessen, wollte die Sache erstmal für mich übersichtlich angehen (gerade mal ein paar Übungen aus dem Buch gemacht), um zu sehen wo eventuelle Fehler stecken...bla, auch egal....bin offen für jeden Verbesserungsvorschlag!

      Möchte halt, dass die vorhandene Tabelle "Inventar" auf dem SQL-Server mit den generierten Daten aus der .dat aktualisiert wird. Also dachte ich mir (auch wenn fälschlicherweise): Ich ziehe mir die Daten aus der Tabelle der .dat, welche noch NICHT in "Inventar" vorhanden sind & packe sie in eine neue Tabelle "daten_neu", Daten die vorhanden sind, packe ich wieder in eine neue Tabelle "daten_update" - Es kann sich ja der Raum geändert haben, das Datum ja sowieso.....(Hintergrund ist, dass ich mir später eine Art Protokoll basteln möchte, das mir nach der Prozedur anzeigt welche Daten neu sind bzw. upgedatet wurden - (vielleicht brauch ich dazu auch gar net die zwei Tabellen......... , über das Protokoll zerbrech ich mir später den Kopf)) Aus "daten_neu" & "daten_update" wollte ich dann eine neue Tabelle erstellen, welche zusätzlich die Daten beinhaltet, die in "Inventar" stehen, in der aktuellen ".dat_tabelle" aber nicht vorhanden sind. Mit dieser Finalen Tabelle "Inventar_neu" wollte ich die aktuelle "Inventar"-Tabelle überschreiben. Ja, das klingt alles verdammt umständlich, ziehe auch hiermit den Titel des Themas zurück........ Es gibt da auch diesen UPDATE-Befehl, jedoch weiss ich gar nicht wie ich den in meinem Fall anwenden könnte (und ob überhaupt.....). Auch wenn sich manche jetzt an den Kopf fassen, bin ich über jeden Lösungsvorschlag dankbar.

      Gruß

      Kommentar


      • #4
        ja. den titel muss du ändern ...

        phpmyadmin siehe unter http://www.phpmyadmin.net da findest du auf jeden fall noch ein paar infos.

        ok. jetzt habe ich zumindest den sinn verstanden und kann die, welch ein wunder, helfen ...

        ich gehe mal davon aus, dass du die daten aus der .dat in die DB bekommst. wenn nicht, muss ich mir da auch noch was einfallen lassen ....

        zuerst legst du einen tabelle an, die das inventar beinhaltet.

        Code:
        CREATE TABLE Inventar (
          InvId int(11) NOT NULL auto_increment,
          InvSerialNr varchar(50) NOT NULL default '',
          InvOrt varchar(20) default NULL,
          InvDatum datetime default NULL,
          PRIMARY KEY  (InvId),
          UNIQUE KEY InvSerialNr (InvSerialNr)
        );
        die tabelle beinhaltet folgende felder.
        id ist fortlaufend
        serialnr ist deine nummer
        ort und datum ist klar datum ist aber datum und uhrzeit ...
        zusätzlich habe ich auf seriennr einen UNIQUE KEY gelegt. das besagt, dass der dortige wert eindeutig sein muss. eine SN darf NUR EINMAL in der ganzen spalte vorkommen.
        ist ein teil mit SN 123 schon drin, kannst du kein weiteres mit der SN 123 eingeben. brauchste ja auch nicht, ist ja schliesslich das gleiche wie das was schon drin ist. ok?

        soweit verstanden?

        wenn du nun einen datensatz in dieser tabelle anlegst, geht das so.

        Code:
        INSERT INTO Inventar (InvSerialNr,InvOrt,InvDatum) VALUES ('127634', 'raum a oder im keller :-)', NOW());
        NOW() ist eine mysql funktion, sollte aber auch bei mssql dabei sein und liefert das aktuelle datum und die zeit.

        wenn du jetzt den gleichen insert nochmal machst, bekommst du einen fehler, da eine keyverletzung aufgetreten ist. (SN ist ja schon drin)

        in diesem fall musst du ein update des datensatzes machen.

        Code:
        UPDATE Inventar SET InvOrt = 'neuer ort', InvDatum = NOW() WHERE InvSerialNr = 'die nummer die schon drin war hier also 127634'
        man kann das auch mit einmal machen. INSERT und UPDATE bei bedarf. habs aber selber noch nie gemacht.

        das ist der syntax...
        Code:
            INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
                [INTO] tbl_name [(col_name,...)]
                VALUES ((expression | DEFAULT),...),(...),...
                [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
        or  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
                [INTO] tbl_name [(col_name,...)]
                SELECT ...
        or  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
                [INTO] tbl_name
                SET col_name=(expression | DEFAULT), ...
                [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]

        und hier mal mein versuch

        Code:
        INSERT INTO Inventar (InvSerialNr,InvOrt,InvDatum) VALUES ('127634', 'raum a oder im keller :-)', NOW()) ON DUPLICATE KEY UPDATE InvOrt = 'neuer ort', InvDatum = NOW()
        so. das wäre erst einmal mein versuch, mit dem du HOFFENTLICH klar kommen solltest... spiele mal ein wenig rum.

        gruß
        abra
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Hm.... vielen Dank für Deine Mühe. Folgende Frage hätte ich da noch, bevor ich rumteste:

          Bei VALUES beziehe ich mich doch wieder auf fest definierte Werte, oder kann ich zusätzlich die Bedingung wie gleich bla aus Tabelle....setzen?

          INSERT INTO Inventar (InvSerialNr,InvOrt,InvDatum) VALUES ('127634', 'raum a oder im keller :-)', NOW()) ON DUPLICATE KEY UPDATE InvOrt = 'neuer ort', InvDatum = NOW()
          Bei mir soll er sich die direkt aus der daten-Tabelle ziehen...(die mit den Inhalten aus dem Datenimport der .dat ...funzt wunderbar, der Import) Guck Dir mal an, was ich als erstes zusammengebastelt habe (so quasi Buch lesen, gleichzeitig Code stricken.....):

          DROP TABLE [bka].[dbo].[daten_update]
          CREATE TABLE [bka].[dbo].[daten_update]([Col001] nvarchar(255) NOT NULL, [Col002] nvarchar(255) NOT NULL, [Col003] datetime NOT NULL,)

          INSERT INTO daten_update
          SELECT daten.Col001, daten.Col002, daten.Col003
          FROM terminal CROSS JOIN Inventar
          WHERE (daten.Col001 = Inventar.HW_SN)

          DROP TABLE [bka].[dbo].[daten_neu]
          CREATE TABLE [bka].[dbo].[daten_neu]([Col001] nvarchar(255) NOT NULL, [Col002] nvarchar(255) NOT NULL, [Col003] datetime NOT NULL,)

          INSERT INTO daten_neu
          SELECT daten.Col001, daten.Col002, daten.Col003
          FROM terminal CROSS JOIN Inventar
          WHERE daten.Col001 <> Inventar.HW_SN
          (mit meinen Worten: zieh mir alles aus der Tabelle daten, was anhand der Seriennummer zu Tabelle Inventar abweicht.......funzt aber net...

          Ja, jetzt darfst Du mit dem Kopf schütteln.... ... wenn er net schon zwischendurch abgefallen ist.... Weisst dafür so ungefähr wo ich hin wollte....Primärschlüssel müsste ich wohl auf jeden Fall setzen. Wobei das mit den CROSS, INNER & OUTER JOINS ich auch noch net ganz gerafft habe...wurde mir dann so vom System vorgegeben. Das Datum soll er ruhig von der daten-Tabelle nehmen, net das aktuelle. Ich muss weg, werde dann wohl so zum Mittag anfangen in die Tasten zu klimpern...

          Gruß
          calimero

          Kommentar


          • #6
            deine sql's habe ich mir gar nicht erst durchgelesen ...

            bei UPDATE kannst du immer ein WHERE angeben. sollte man auch machen, da ansonsten die spalte in ALLES DATENSÄTZEN geändert würde.

            bei INSERT ist das natürlich nciht machbar, denn du fügst ja was ein.
            es kann nur sein, dass man das bei ON DU... KEY machen müsste. ich denke mir aber, dass er die zeile UPDATEd, die die keyverletzung gemacht hat.

            teste es einfach mal ...
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar

            Lädt...
            X