[MSSQL] Update mit Unterabfrage

jazde86

Grünschnabel
Hallo,

ich möchte in einer Tabelle Artikel die mit aufsteigender Reversion sozusagen als Duplikate angelegt werden anpassen:
1. Folgeartikel bei älteren Reversionen eintragen.
2. Ältere Artikel sperren, nur den aktuellen aktiv lassen.

Artikelnummern bestehen aus 10 Zeichen und beginnen immer mit "ART". Die zehnte Stelle stellt die Reversion da, von 0 bis 9 - falls es welche gibt, z. B.
ART7893010
ART7893011
ART7893012

Was ich bereits habe und einwandfrei funktioniert ist folgendes:

1. Auflistung aller Artikelnummern, die nicht gesperrte Reversionen enthalten:
SQL:
SELECT ArtikelNummer, Bezeichnung, FolgeArtikel, Verkaufssperre
FROM Artikel
WHERE EXISTS (
    SELECT SUBSTRING(Artikel.ArtikelNummer, 0, 9), Bezeichnung, COUNT(*)
    FROM Artikel Dup
    WHERE ArtikelNummer LIKE 'ART%' AND SUBSTRING(Artikel.ArtikelNummer, 0, 9) = SUBSTRING(Dup.ArtikelNummer, 0, 9) AND Verkaufssperre != 1
    GROUP BY SUBSTRING(ArtikelNummer, 0, 9), Bezeichnung
    HAVING COUNT(*) > 1
)
ORDER BY ArtikelNummer;

2. Alle älteren Reversionen einer einzelnen ArtikelNummer aktualisieren:
SQL:
UPDATE Artikel
SET FolgeArtikel = (
    SELECT TOP(1) ArtikelNummer
    FROM Artikel
    WHERE ArtikelNummer LIKE 'ART789301%' AND Verkaufssperre != 1
    ORDER BY ArtikelNummer DESC
  ),
  Verkaufssperre = 1
WHERE ArtikelNummer LIKE 'ART789301%' AND Verkaufssperre != 1
AND ArtikelNummer < (
    SELECT TOP(1) ArtikelNummer
    FROM Artikel
    WHERE ArtikelNummer LIKE 'ART789301%' AND Verkaufssperre != 1
    ORDER BY ArtikelNummer DESC
)

Wie kann ich nun die ArtikelNummer als Variable aus der ersten Abfrage einsetzen und wie den Code evtl. noch optimieren, so daß die Unterabfrage nicht mehrfach ausgeführt werden muß? Jede Zeile enthält auch eine UniqueID, aber die ist zufällig und lässt keine Rückschlüsse auf die neueste Reversion zu.

Danke schon mal für einige Denkanstöße oder Beispiele von Unterabfragen mit Variablen.
 
Zurück