Korbinian Bachl: select ob was nicht da is ...

Hi Forum,

habe folgendes problem:

ich möchte rausfinden ob etwas in 2 tabellen nicht jeweils vorhanden ist ->

newslistenew , newslisteold -> je columns bestnr, preis -> wenn nun eines von beiden abweicht soll er mir das ausspucken aber er macht das nur wenn beide gleich sind...

versteht ihr ?

select * from newslistenew, newslisteold where newslistenew.bestnr, newslistenew.dm != newslisteold.besntr, newslisteold.dm;

leider klappt das nicht....

sinn der sache ist es herauszufinden ob und was in 12 speziellen tabellen geändert wurde... ohne dabei die 12 tabellen anzupassen -> ich erstelle deswegen jeweils kopien und möchte nun herausfinden ob die alte kopie andere daten enthält als die neue kopie und dieses delta, also die änderung , die soll dann in eine neue tabelle rein... dummwerweise klappt das seit tagn nicht ...

hoffe auf hilfe

grüße

Korbinian

  1. Hi,

    select * from newslistenew, newslisteold where newslistenew.bestnr, newslistenew.dm != newslisteold.besntr, newslisteold.dm;

    newslistenew.bestnr != newslisteold.bestnr AND newslistenew.dm != newslisteold.dm

    Ggf. AND durch OR ersetzen, je nachdem was Du willst.

    Cheatah

    1. Hallo !

      SCNR:

      select * from newslistenew, newslisteold where newslistenew.bestnr, newslistenew.dm != newslisteold.besntr, newslisteold.dm;

      newslistenew.bestnr != newslisteold.bestnr AND newslistenew.dm != newslisteold.dm

      Ggf. AND durch OR ersetzen, je nachdem was Du willst.

      Cheatah

      Ich denke 'mal, das war ein schneller Schuß aus der Hüfte.

      Mit derlei lustigen Verknüpfungen hat man ruckzuck verdammt viel Datenmüll fabriziert.

      Gruß,
      kerki

  2. Hallo Korbinian!

    versteht ihr ?

    Sicher bin ich mir da nicht, ich versuch's mal :

    Du speicherst eine Tabelle 'newslistenew' zu einem bestimmten Zeitpunkt als Kopie 'newslisteold' ab und möchtest zu einem späteren Zeitpunkt ermittelt, in welchen Datensätzen von 'newslistenew' Änderungen an den Feldern 'bestnr' oder 'dm' sich seit Erstellung der Kopie ergeben haben.

    Ich hoffe so war es gemeint.

    Dazu zunächst folgendes:

    Klappen wird das Ganze nur, wenn wenigstens noch ein anderes _eindeutiges_ Feld in der Tabelle vorhanden ist, das einen Bezug zwischen den neuen und der alten Version der Tabelle herstellt.

    Ansonsten wird es nicht gelingen, bei einem Vergleich 'neuer Datensatz' != 'alter Datensatz' festzustellen, ob hier 1 Datensatz verändert wurde, oder ob die 2 schon vorher unterschiedlich waren.

    In deinem speziellen Fall könnte 'bestnr' so ein Feld sein, vorausgesetzt, dass es gar nicht verändert, sondern nur hinzugefügt werden kann. Dann könnte deine Abfrage so aussehen:
    ----------------------------------------------------
    SELECT    newslistenew.*
    FROM      newslistenew
    LEFT JOIN newslisteold USING (bestnr)
    WHERE     newslistenew.dm != newslisteold.dm
    OR        newslisteold.bestnr IS NULL
    ----------------------------------------------------

    Wenn aber auch 'bestnr' verändert werden kann, müsste die Abfrage so lauten:
    ----------------------------------------------------
    SELECT    newslistenew.*
    FROM      newslistenew
    LEFT JOIN newslisteold USING (id)
    WHERE     newslistenew.bestnr != newslisteold.bestnr
    OR        newslistenew.dm != newslisteold.dm
    OR        newslisteold.id IS NULL
    ----------------------------------------------------

    wobei dann 'id' ein solches eindeutiges Feld sein müsste, dass bei beiden Tabellen gleich ist.

    Wenn sich solch ein Feld nicht finden lässt, sehe ich keine Lösung für dein Problem. (was nicht heißen muss, dass es keine gibt ;-) )

    Als Literatur empfehle ich hierzu :
    http://www2.rent-a-database.de/mysql/mysql.html im Allgemeinen und
    http://www2.rent-a-database.de/mysql/mysql-118.html, was dein spezielles Problem anbetraf.

    Die verwendete Syntax ist MySQL und getestet habe ich es mit Version 3.21.29a. Für andere Syntax übernehme ich keine Garantie (und für Tippfehler auch nicht ;-) )

    Ich hoffe, das war, was du gesucht hast.

    Gruß,
    kerki

    1. Ich hoffe, das war, was du gesucht hast.

      Gruß,
      kerki

      Ja genau !! das wars... könnte dich Küssen :))))

      habe das ganze auf 3 anfragen verteilt um 1. herauszufinden was neu is -> artikel added
      2. nimmer da is -> artikel deleted
      3. wo preis billiger is -> price changed an pricenew < priceold

      die ausgabe meines scriptes (phph) macht da genau das wass ich will :))

      SELECT newslistenew.* FROM newslistenew LEFT JOIN newslisteold USING (bestnr) WHERE newslisteold.bestnr IS NULL
      NEU
      MT-9999
      SELECT newslisteold.* FROM newslisteold LEFT JOIN newslistenew USING (bestnr) WHERE newslistenew.bestnr IS NULL
      Gelöscht
      MT-9998
      SELECT newslistenew.* FROM newslistenew LEFT JOIN newslisteold USING (bestnr) WHERE newslistenew.dm != newslisteold.dm AND newslistenew.dm < newslisteold.dm
      Preis Billiger
      MT-added
      MT-deleted
      MT-billig80

      ... jetzt wirds dann nur noch in ne newstabelle geschrieben und mit ner flag versehen was geändert war und noch mit zusätzlihen infos versehen..

      also, danke nochmal...

      grüße

      Korbinian

      www.whiskyworld.de
      (erscheint in kürze in neuem glanz)