Announcement

Collapse
No announcement yet.

Case oder IF ??

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

  • Case oder IF ??

    Hi!

    Ich müsste folgende Abfrage machen:
    Ist ein Datensatz in einer Tabelle vorhanden, dann aktualisiere ihn - wenn nicht, dann füge ihn neu ein.

    Hier mein Abfrage:

    CASE
    WHEN LAV_K.kst = AGG.kst
    THEN
    UPDATE LAV.dbo.[LAV_K]
    SET dbo.Menge = dbo.AGG.Alteisen_neu
    FROM dbo.LAV_K INNER JOIN dbo.AGG ON dbo.LAV_K.Kst = dbo.AGG.KST
    WHERE dbo.LAV_K.ArtikelNummer = 3200
    ELSE
    INSERT INTO [LAV].[dbo].[LAV_K]
    SELECT * FROM dbo.LAV_DATA INNER JOIN
    dbo.AGG ON dbo.LAV_DATA.Kst = dbo.AGG.Kst
    WHERE dbo.LAV_DATA.ArtikelNummer = 3200
    END


    Nun meine Frage ob das Case When oder eine IF Else Abfrage besser wäre
    (funktionieren beide leider nicht bei mir)??

    Oder gibts ne andere bessere Lösung für SQL 2005?

    Thx, Solardub
    Zuletzt editiert von Solardub; 07.05.2012, 15:57.

  • #2
    Hallo,

    weder CASE noch die Funktion IF sind als Bestandteil von SQL geeignet um ein oder ein anderes Statement auszuführen. Hiermit kannst du nur INNERHALB EINES Statements anhand einer Bedingung zwischen Ausdrücken, nicht aber zwischen Anweisungen unterscheiden.
    Je nach DBMS gibt es versch. Möglichkeiten dein Vorhaben zu realisieren. Welches verwendest du?

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Wie Christian schon geschrieben hat geht sowas in reinem SQL nicht. Wenn dann müsstest Du das in der datenbankeigenen Programmiersprache machen (PLSQL, TSQL...)

      Comment


      • #4
        Danke für die Info!
        Habe bis jetzt nur mit dem SQL SM Studio Express gearbeitet um meine Abfragen zu machen, aber darin kann man ja nicht programmieren, oder?.
        Habe zwar früher etwas in c/c++ programmiert, aber das ist lang, lang her ;-)

        Welches Programm wäre hier den zu verwenden?
        Wie könnte ich das am besten mit MS SQL 2005 realisieren?

        Comment


        • #5
          Also erstmal:
          Ist das eine Abfrage?

          Ich sehe ein Insert und ein Update.

          Um welchem Zusammenhang geht es dabei?
          Datenpflege/ Datenkonsistenz> Trigger (programmieren),
          (einamlige) Datenbereinigung > 1xInsert, 1xUpdate
          Datenaufbereitung .. ?

          Vermutlich musst Du nicht unbedingt programmieren. Es würde reichen Insert und Update getrennt zu verarbeiten mit entsprechenden Where Bedingungen.
          Alternativ gibt es Merge oder Upsert, was beide Operationen zu einem Statement zusammenfasst. (weiß nicht, wie das in MSSQL ist)
          Gruß, defo

          Comment


          • #6
            Hi Defo!
            Es geht um eine Datenaufbereitung wo ich abfrage ob Datenvorhanden sind -> wenn ja, aktualisiere ich sie und wenn die Daten nicht vorhanden sind, dann muss ich die Datensätze neu schreiben.
            Darum wollte ich was mit Case When oder IF Else machen.

            Ich werde es mit einer Prozedur Studio Express versuchen, das sollte doch machbar sein?

            Comment


            • #7
              Klar eine Stored Procedure sollte immer möglich sein.
              Letzlich ist es wurscht, womit Du das erstellst. Notfalls reicht notepad.
              Gruß, defo

              Comment


              • #8
                Ich habs jetzt mal mit einer Prozedur versucht, aber das klappt nicht so richtig:
                (leider noch nie gemacht, ab und an mal ein paar Querys)


                CREATE PROCEDURE EGG_Update
                AS

                DECLARE @Jahr as DATETIME
                SET @Jahr = '2011-01-01 00:00:00'


                BEGIN
                IF LAV_K.kst = AGG.kst
                BEGIN
                UPDATE LAV.dbo.[LAV_K]
                SET dbo.Menge = dbo.AGG.Alteisen_neu
                FROM dbo.LAV_K INNER JOIN dbo.AGG ON dbo.LAV_K.Kst = dbo.AGG.KST
                WHERE dbo.LAV_K.Kst = dbo.AGG.Kst AND dbo.LAV_K.ArtikelNummer = 3200
                END
                ELSE
                BEGIN
                INSERT INTO [LAV].[dbo].[LAV_K]
                (...........


                Bekomme immer die Fehlermeldung: Der mehrteilige Bezeichner LAV_K.kst oder auch AGG.kst konnte nicht gebunden werden.

                Bin ich jetzt komplett am falschen Weg?

                Comment


                • #9
                  Oder wie könnte ich das sonst realisieren?

                  Comment


                  • #10
                    Hallo,

                    du solltest dir zuerstmal im Klaren sein, was du überhaupt machen willst. Du willst Daten abgleichen. Woher stammen diese? Was wird wie miteinander verglichen?

                    Der Ausdruck "IF LAV_K.kst = AGG.kst" ist sehr sinnfrei, wenn es sich dabei um zwei Bezeichner für Tabelle und Feld handelt. Welche Datensätze sollen da verglichen werden? Der Erste mit dem Letzten? Einer mit Jedem? Jeder mit Jedem?

                    SQL arbeitet Mengenorientiert! Wenn du eine sequentielle Aufbereitung machen willst/musst, dann müsstest du schon irgendwie einen Cursor definieren und den dann in einer Schleife durchlaufen.

                    Gruß Falk

                    P.S.: Formatierung von SQL in Beiträgen
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment


                    • #11
                      Wie bereits geschrieben, im einfachsten Fall brauchst Du nur hintereinander 2 Statements durchzuführen. Dein "IF" wird dabei in den Where Bedingungen der beiden Statements behandelt.
                      Meine TSQL Zeit ist schon was her also hier nur Pseudo Code:

                      Code:
                      CREATE PROCEDURE EGG_Update
                      ..
                      BEGIN
                        UPDATE LAV.dbo.[LAV_K]
                        SET dbo.Menge = dbo.AGG.Alteisen_neu
                        FROM dbo.LAV_K INNER JOIN dbo.AGG ON dbo.LAV_K.Kst = dbo.AGG.KST
                        WHERE dbo.LAV_K.Kst = dbo.AGG.Kst AND dbo.LAV_K.ArtikelNummer = 3200
                        {AND NOT dbo.Menge = dbo.AGG.Alteisen_neu}  -- unnötiges update ausschließen
                      
                      
                        INSERT INTO [LAV].[dbo].[LAV_K]
                        WHERE not exists {Menge aus Update}
                      ..
                      END
                      Damit sparst Du einen Cursor. Ob es schneller ist als mit Cursor, hängt mit den Mengenverhältnissen zusammen. Sind die wirklich zu ändernden Mengen klein, könnte ein Cursor sinnvoll sein.
                      Gruß, defo

                      Comment


                      • #12
                        Hallo Falk!
                        Ich habe in einer DB zwei Tabellen (LAV_K/AGG) in denen ich Felder (kst) miteinander vergleichen will.
                        Ist in beiden Tabellen ein gleicher Wert (zB: kst=100) vorhanden, dann soll er diesen Datensatz in LAV_K updaten - sonst wird ein neuer Datensatz mit Insert eingefügt.

                        Aber ich glaube es geht schneller, wenn ich die vorhandenen Datensätze lösche und alle neu schreibe. Das jetzt irgendwie ausprogrammieren ist glaube ich zu kompliziert und würde auch zu lange dauern.

                        Danke jedenfalls!!!
                        :-)

                        Comment

                        Working...
                        X