Announcement

Collapse
No announcement yet.

Select in Delete umwandeln

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

  • Select in Delete umwandeln

    HI!
    Ich habe eine MS Sql Server 2005 Version.

    Habe mir einen SQL Befehl zum selektieren gesucht.
    Jetzt würde ich diesen "einfach" in einen DELETE Befehl umwandeln (das was angezeitgt wurde soll gelöscht werden )
    Funktioniert leider nicht ganz soooo einfach (>>as<<)...

    Befehl sieht so aus:

    SELECT a, b, c
    FROM tablemaster AS master1
    WHERE
    b NOT BETWEEN
    DATEADD("d", -6, DATEADD("d", -DAY(CAST(b as Datetime)), DATEADD("m", 1, CAST(b AS Datetime))))
    AND
    DATEADD("d", -DAY(CAST(b as Datetime)), DATEADD("m", 1, CAST(b AS Datetime)))
    AND
    master1.b
    NOT IN
    ((SELECT TOP 3 b FROM tablemaster AS master2
    WHERE master1.c = master2.c
    AND master1.a = master2.a ORDER BY b DESC))

  • #2
    Hallo,

    wieso funktioniert das nicht so einfach, wo ist das Problem (gibt es Fehlermeldungen)?

    Einfach "SELECT a,b,c" durch DELETE ersetzen und den Alias "master1" entfernen.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Das Problem liegt wohl darin, dass sich die tabelle selber referenziert. Ich arbeite dann meisens mit einer CTE (common table expression), etwa so:

      Code:
      ;WITH tmp(a2, b2, c2) AS (
        SELECT a, b, c FROM tablemaster AS master1
        WHERE b NOT BETWEEN
        DATEADD("d", -6, DATEADD("d", -DAY(CAST(b as Datetime)), DATEADD("m", 1, CAST(b AS Datetime))))
        AND DATEADD("d", -DAY(CAST(b as Datetime)), DATEADD("m", 1, CAST(b AS Datetime)))
        AND master1.b NOT IN
        ((SELECT TOP 3 b FROM tablemaster AS master2
      WHERE master1.c = master2.c
        AND master1.a = master2.a ORDER BY b DESC))
      )
      delete tablemaster where exists(select * from tmp where a2 = a and b2 = b and c2 = c)
      Ist natürlich nicht getestet, aber zumindest der Ansatz sollte ersichtlich sein

      bye,
      Helmut

      Comment

      Working...
      X