Anzeige

 MS SQL Abfrage, mehrere Werte ermitteln, max bis 1 löschen


#1
Hallo zusammen,

mit einer DB Abfrage ermittele Ich folgende Duplikate:
Mit der Abfrage bekomme Ich ca. 140.000 Einträge.
SQL:
SELECT
    swt.tb_id as TBID,
    swt.sw_id as SWID_1,
    sw.sw_id as SWID_2,
    sw.sw_bezeichnung as SW_Name
FROM
    [sw_to_tb] swt
    INNER JOIN schlagwort sw ON(sw.sw_id = swt.sw_id)
WHERE
    --tb_id = 104 AND
    sw.sw_id NOT IN(
        SELECT MAX(swx.sw_id) as Einmal FROM schlagwort swx
        GROUP BY swx.sw_bezeichnung
        HAVING COUNT(*) = 1
    )
GROUP BY sw.sw_bezeichnung, swt.tb_id, swt.sw_id, sw.sw_id
ORDER BY TBID
Mit der Abfrage bekomme Ich ca. 69.000 Einträge.
SQL:
SELECT
    swt.tb_id as TBID,
    swt.sw_id as SWID_1,
    sw.sw_id as SWID_2,
    sw.sw_bezeichnung as SW_Name
FROM
    [sw_to_tb] swt
    INNER JOIN schlagwort sw ON(sw.sw_id = swt.sw_id)
WHERE
    tb_id = 104 AND
    sw.sw_id NOT IN(
        SELECT MAX(swx.sw_id) as Einmal FROM schlagwort swx
        GROUP BY swx.sw_bezeichnung
        HAVING COUNT(*) = 1
    )
    AND sw.sw_bezeichnung LIKE '%TEST2%'
GROUP BY sw.sw_bezeichnung, swt.tb_id, swt.sw_id, sw.sw_id
ORDER BY TBID
Zum Beispiel hat TBID (104) und der SW_NAME (TEST2) zur TBID (104) insgesamt: 68.608 Einträge

Nun möchte Ich folgendes Erreichen:
Wenn bei TBID bereits ein SW_NAME mehrfach vorhanden ist, soll Er diese solange Löschen, bis für das TBID nur noch ein Eintrag vorhanden bleibt.

Allerdings scheitere Ich schon beim weiteren Vorgehen, da Ich nicht weiß wie Ich wo was ansetzen soll :(
 

Zvoni

Erfahrenes Mitglied
#2
Als Ansatz: Hat MSSQL sowas wie eine ROW_NUMBER-Funktion?
Der Ansatz wäre dann etwa: DELETE FROM MyTable WHERE RN>1 (RN wäre der Alias für den ROW_NUMBER)
Um in deinem Beispiel zu bleiben:
Das Resultat deiner Abfrage oben hätte dadurch eine zusätzlich Spalte für RN, welche fortlaufend durchnumeriert wird, nach welcher du dann filtern kannst.

EDIT: Ich vergas: ROW_NUMBER macht natürlich nur Sinn in Kombination mit einer PARTITION-Funktion.
Ich weiss jetzt aber nicht, wie die bei MSSQL heisst (oder ob MSSQL sowas überhaupt hat), da ich aus der IBM/DB2-Ecke komme
 
Zuletzt bearbeitet:
Anzeige