# SQL Abfrage Dupliakte bei Kreuzvergleich



## marccmd (16. Okt 2011)

Hallo liebe Community,

Ich zermartere mir nun schon das ganze WE den Kopf, jetzt brauche ich Hilfe. Ich habe folgendende Forumseinsteigerfrage )

Ich habe eine Tabelle der Struktur:

ID_Vorgang    Kunde    Name    Nachname    weitere Felder(diverse Freitexte)

Ich möchte nun alle "Duplikate" folgender Art finden: alle ID_Vorgang, welche den selben Kunden haben, Feld Kunde kann leer sein, stattdessen kann der Kunde auch in Name oder Nachname oder oder stehen (Bitte keine Rüge für diese Struktur, nicht auf meinem Mist gewachsen  ). Also vergleiche alle hintlegten Kundennummer, ob diese in irgendeinem anderen Ticket in den anderen Angaben steht.
Das passiert grundlegend schon mal so:


```
SELECT 
  a.ID_Vorgang AS Duplikat_Vorgang, b.ID_Vorgang AS Referenz_Vorgang, b.Kunde AS Referenz_Kunde
FROM 
  vorgaenge a, vorgaenge b
WHERE   
  -- Ausschlusskriterien für Feld Kunde
        LEN(b.Kunde) = 10 AND NOT b.Kunde = '0000000000' --was man eben in solche Freifelder schreibt, wenn man keine Lust auf echte Angaben hat
  -- Kreuzvergleich muss sich selbst ausschließen
  AND   a.ID_Vorgang <> b.ID_Vorgang
  -- + Felder, in denen das Merkmal enthalten sein kann
  AND  (
        a.Name LIKE '%' + b.Kunde + '%'
    OR  usw );
```

Das Ergebnis hat aber noch folgende Macke:

Duplikat_Vorgang    Referenz_Vorgang    Referenz_Kunde
1111111111        2222222222        irgendwer
…            …            …
2222222222        1111111111        irgendwer

Dieser Kreuzvergleich führt natürlich auch zu Doppeln, die ich gern aus der Ergebnismenge raus hätte.

Ansatz:

```
SELECT a.* 
FROM 
    (die ganze obere Abfrage) a, (die ganze obere Abfrage) b -- jetzt wieder über Kreuz *ächz*
WHERE NOT
      (a.Duplikat_Vorgang = b.Referenz_Vorgang AND b.Duplikat_Vorgang = a.Referenz_Vorgang )
```

Das Ergebnis ist Mist, den ich nicht interpretieren kann. Am liebsten wär mir ja schon gewesen, dass ich statt
(die ganze obere Abfrage) a, (die ganze obere Abfrage) b lieber (die ganze obere Abfrage) a und b geschrieben hätte, allein wegen der Ausführzeit. Kann man einer Tabelle "klonen" mittels zweier Aliase? Finde dazu nichts. Wo liegt der Fehler in der ausführlich geschriebenen Variante?

Wäre super dankbar für Tips…

LG


----------



## SlaterB (16. Okt 2011)

was du mit der zweiten doppelten Auswertung vorhast kann ich bisher nicht wirklich erkennen,
einfach nur das 'Gegenüber' zu verbieten ist zu wenig, denn das beträfe ja alle, wieso sollte einer von beiden drinbleiben?
mal abgesehen davon dass du bisher eher zu viele als zu wenige Ergebnisse hast

du kannst diese Art der Doppelten schon in der ersten Auswertung verhindern,
der allgemeine Trick lautet [c]a.ID_Vorgang < b.ID_Vorgang[/c] statt [c]a.ID_Vorgang <> b.ID_Vorgang[/c]
->
1111111111 2222222222 gut
2222222222 1111111111 schlecht


----------



## marccmd (17. Okt 2011)

Hi und vielen Dank. Mensch das ist ja erschreckend simpel *schäm* voll ins Schwarze und sowas von logisch. Erschreckend  DANKE


----------

