dobra: Datenabgleich mit Bedingung

Hallo,

ich möchte in einer Abfrage 2 Tabellen vergleichen und die Artikel auslesen, die NICHT in beiden Tabellen vorkommen.

so weit bin ich gekommen:
SELECT t1.itemid, t2.itemid
FROM Tabelle1 AS t1 RIGHT JOIN Tabelle2 AS t2 ON t1.itemid=t2.itemid
WHERE IsNull(t1.itemid);

-> gibt mir alle Artikel aus, die in Tabelle 2 stehen aber nicht in Tabelle 1

mein Problem ist, daß ich in Tabelle 2 Artikelnummern habe, die ein Teilstring von den Artikelnummern in Tabelle 1 sind und auch NICHT ausgegeben werden sollen.

also z.B. Artnr in Tabelle 1 xyz-10, xyz-20
und in Tabelle 2 xyz

in der Access Abfrage habe ich das so gemacht:
IIf(InStr(Tabelle1.ArtNr,"-") <>0, Left(Tabelle1.ArtNr,InStr(Tabelle1.ArtNr,"-")-1) AS dummyspalte

aber ich bringe diese Unterabfrage nicht in die SQL Abfrage :'(

Kann mir bitte jemand helfen?
(ich hoffe, daß ich halbwegs verständlich beschreiben konnte, was ich machen möchte?)

Vielen dank im Voraus
dobra

  1. Hallo,

    um die Artikel aus der zweiten Tabelle zu bekommen, die es in der ersten nicht gibt, kannst du noch einen LEFT JOIN machen und die beiden Ergebnisse via UNION verknüpfen.

    Bei den Teilstrings kann ich nur raten: Probier mal, die Verknüpfungs-Bedingung hinter dem ON entsprechend anzupassen.

    Viele Grüße
    BurninLeo

    1. Hallo,

      die Code-Beispiele im angehängten Link nutzen NOT EXISTS - das könnte dir auch weiterhelfen:
      http://www.die-informatiker.net/post/Fachsimpelei/MINUS_oder_INTERSECT_in_MySQL/69692#69692

      Viele Grüße

      BurninLeo

      1. Hallo an alle,

        ich hab's mit den Bedingung nicht hingekriegt :(

        aber ich habe ein Möglichkeit gefunden, *ohne* diese Bedingung das Ergebnis zu bekommen das ich brauch
        allerdings mit *DREI* Abfragen...

        1. importiert den aktuellen Lagerstand aus CSV Datei in meine Shop DB
        2. löscht Artikel aus der Shop DB die in der CSV nicht mehr enthalten sind = die es nicht mehr gibt
        3. löscht Varianten aus der DB

        Damit ich ganze Ablauf problemlos automatisieren kann, wäre es schön, wenn ich das in EINER Abfrage erledigen könnte....
        dazu reichen aber meine seeeehr rudimentären Kenntnisse aber nicht :(

        Ich weiß, diese Bitte ist unverschämt, aber vielleicht hat jemand Zeit mir aus meinem "Flickwerk" eine komplette Abfrage zusammen zu bauen?

        SELECT schmuck_csv.ArtNr, ...., schmuck_csv.NeuZugang,
        Round(IIf(schmuck_csv.Listenpreis<5,schmuck_csv.Listenpreis*1.8,IIf(schmuck_csv.Listenpreis<10,.....schmuck_csv.Listenpreis*1.4)))))),1) AS myPreis,
        IIf(InStr(schmuck_csv.ArtNr,"-") <>0, Left(schmuck_csv.ArtNr,InStr(schmuck_csv.ArtNr,"-")-1)) AS vari
        FROM schmuck_csv;

        SELECT schmuck_csv.BildGross, SCH_ITEM.MYIMAGE, SCH_ITEM.ITEMID, '1' AS loeschen
        FROM schmuck_csv AS schmuck_csv RIGHT JOIN SCH_ITEM AS SCH_ITEM ON schmuck_csv.BildGross=SCH_ITEM.MYIMAGE
        WHERE IsNull(schmuck_csv.BildGross);

        SELECT schmuck_csv.ArtNr, SCH_SITM.ITEMID, '1' AS loeschen
        FROM schmuck_csv RIGHT JOIN SCH_SITM AS SCH_SITM ON schmuck_csv.ArtNr=SCH_SITM.ITEMID
        WHERE IsNull(schmuck_csv.ArtNr);

        lg aus Wien
        dobra

  2. Hello,

    IIf(InStr(Tabelle1.ArtNr,"-") <>0, Left(Tabelle1.ArtNr,InStr(Tabelle1.ArtNr,"-")-1) AS dummyspalte

    für jeden dieser Operatoren gibt es eine Entsprechung in deinem jeweiligen SQL-Dialekt.
    Welches SQL suchst du? MySQL, MS-SQL, ...?
    Das Handbuch sollte dir unter Control Flow und String-Functions weiterhelfen.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Death is nature's way of telling you to slow down.
    1. zuerst mal Danke für die Tipps - kann's leider erst Abend probieren.

      Meine DB ist eine mySQL Datenbank

      ... und ich muß gestehen, daß ich seeeehr wenig Ahnung vom SQL Syntax habe
      die Teillösungen habe ich mir im web zusammengesucht und nur für meine Probleme angepasst.

      Die korrekte Verwendung von JOIN, UNION usw. sind leider (noch) "Zufallstreffer" für mich ;)

      1. Hello,

        IIf(InStr(Tabelle1.ArtNr,"-") <>0, Left(Tabelle1.ArtNr,InStr(Tabelle1.ArtNr,"-")-1) AS dummyspalte

        also, dein
        IIf = CASE WHEN
        InStr = INSTR
        Left = LEFT
        damit solltest du alles haben.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
        1. Danke!

          mfG
          dobra

        2. echo $begrüßung;

          IIf(InStr(Tabelle1.ArtNr,"-") <>0, Left(Tabelle1.ArtNr,InStr(Tabelle1.ArtNr,"-")-1) AS dummyspalte

          Da fehlt übrigens noch was, die Klammer von IIf ist nicht geschlossen.

          IIf = CASE WHEN

          Es gibt auch IF(), und das lässt sich bei einfacher if-else-Entscheidung angenehmer notieren als das CASE-Konstrukt.

          Außerdem verlinktest du auf das CASE-Statement für Stored Procedures, das eine klein wenig andere Syntax (END vs. END CASE) hat als der CASE-Operator, den man in einer Query einbauen kann.

          echo "$verabschiedung $name";