rss
twitter
  •  

SQL – Duplikate finden und löschen

| Posted in Technik |

22

Hin und wieder ist man mit doppelten Einträgen in einer Datenbank und dem Problem der Beseitigung konfrontiert. Nachfolgend zeige ich einen Weg, wie sich per SQL Duplikate effektiv finden und entfernen lassen.

Meine Test-Tabelle ist eine einfache Adresstabelle mit etwas über 400.000 Datensätzen und etlichen Duplikaten.

Der übliche Tipp zum Auffinden von Duplikaten mit Hilfe von GROUP BY und HAVING COUNT(*)>1 ist aber in meinen Augen sehr unpraktisch, wie die folgende Abbildung verdeutlicht.

Duplikate finden - Variante 1

Nicht wirklich praktikabel…

Viel anzufangen ist mit diesem Ergebnis nicht. Wir wissen jetzt zwar, daß wir doppelte Einträge in der Tabelle haben, aber das wußten wir vorher ja auch schon. Ein weiterer Nachteil dieser Abfrage ist die schlechte Performance im Vergleich zur nachfolgend vorgestellten Lösung.

Die wesentlich elegantere Variante ist die Verwendung einer sogenannten Correlated Subquery. Hinter dieser Art der Abfrage verbirgt sich ein indirekter Self-Join, da ein und dieselbe Tabelle in zwei miteinander in Wechselwirkung stehenden Abfragen gemeinsam verwendet wird. Über eine Correlated Subquery kann ich nun also alle doppelten (oder auch mehrfach vorkommenden) Datensätze mit jeweils einer einzigen SQL-Anweisung anzeigen bzw. löschen.

Mit der folgenden Abfrage lasse ich mir alle Datensätze anzeigen, in denen Vorwahl und Telefonnummer doppelt vorkommen.

SELECT Id, Vorname, Nachname, Strasse, PLZ, Ort, Vorwahl, Telefon
FROM testdat
WHERE EXISTS (
SELECT Id FROM testdat Dup WHERE testdat.Vorwahl = Dup.Vorwahl AND testdat.Telefon = Dup.Telefon AND testdat.Id <> Dup.Id)
ORDER BY Nachname;

Wie die nächste Abbildung zeigt, sind die gelieferten Informationen hier wesentlich ausführlicher.

aa

…schon besser!

Auf gleiche Weise kann ich nun auch die vorhandenen Duplikate aus der Tabelle löschen:

DELETE FROM testdat
WHERE EXISTS (
SELECT Id FROM testdat Dup WHERE testdat.Vorwahl = Dup.Vorwahl AND testdat.Telefon = Dup.Telefon AND testdat.Id < Dup.Id);

Damit werden nun alle Duplikate mit der kleineren Id gelöscht.

Blackberry Enterprise-Aktivierung nach Server-Crash

| Posted in Technik |

0

Wer schon einmal das „Glück“ hatte, einen Server tauschen zu müssen, auf dem Exchange und der Blackberry Enterprise Server (BES) laufen, und nach dem Tausch Probleme hatte, die Blackberrys wieder zu aktivieren, findet in diesem Artikel möglicherweise die Lösung.

Problem: Nach einem Crash des Exchange-Servers, Austausch des Servers, Wiederherstellung und Zurückspielen der Datensicherung klappt die (erneute) Blackberry-Aktivierung für vorhandene Postfächer nicht.

Im Blackberry Administration Service steht der Status für die entsprechenden User auf Initializing.

Das ALRT-Log enthält folgende Meldungen:

(AFFF4F29) -> {users email address} MAPIMailbox::CheckSearchCriteria - GetSearchCriteria (0x80040102) failed
(AFFF4F29) -> {users email address} MAPIMailbox::CheckMsgOnDeviceSearchCriteria - GetSearchCriteria (0x80040102) failed
(AFFF4EB8) -> OpenDatabase() failed for usernamee
(AFFF4EBA) -> User username not started
(6FFFC39F) -> 1 user(s) failed to initialize

Das MAGT-Log enthält außerdem diese Meldungen:

Starting handheld for username

[40704] (06/27 14:41:42.609):{0x258C} MAPIMailbox::MAPIMailbox(2) ServerDN= …
[40739] (06/27 14:41:42.609):{0x258C} MAPIMailbox::MAPIMailbox(2) - ResolveName[1] success for DisplayName= ...

[40204] (06/27 14:41:42.609):{0x258C} MailboxManager::GetMailboxSession - Using MAPI profile 'besadmin'

[40430] (06/27 14:41:42.609):{0x258C} {email address} MAPIMailbox::MAPIMailbox(2) - Mailbox opened on session 0x013dbd08

[40153] (06/27 14:41:42.609):{0x258C} PMDatabase::OpenNamedFolder: opening existing folder 'BlackBerryHandheldInfo'

[40155] (06/27 14:41:42.609):{0x258C} PMDatabase::OpenNamedFolder: opened an existing folder 'BlackBerryHandheldInfo'

[40158] (06/27 14:41:42.609):{0x258C} Pager::OpenClientDatabase: invalid number of messages in client folder , num msg = 4

[20152] (06/27 14:41:42.609):{0x258C} OpenDatabase() failed for username

[40205] (06/27 14:41:42.609):{0x258C} MailboxManager::CloseMailboxSession - closing session

[20154] (06/27 14:41:42.609):{0x258C} User username not started

Ursache: Im Postfach des Benutzers auf dem Exchange werden bei der Aktivierung für Blackberry versteckte Ordner angelegt (siehe Screenshot).

Blackberry - Versteckte Verzeichnisse

Versteckte Verzeichnisse in Blackberry-aktivierten Mailboxen

Der Ordner BlackBerryHandheldInfo verursacht in diesem Fall das Problem. Normalerweise wird dieser Ordner wohl entfernt, wenn ein Benutzer vom BES entfernt wird. In meinem Fall sind dieser Ordner bzw. die darin enthaltenen Informationen beim Zurückspielen der Datensicherung offensichtlich beschädigt worden.

Lösungsmöglichkeit 1: Der entsprechende Benutzer wird vom BES entfernt und neu hinzugefügt (hat in meinem Fall nichts gebracht).

Lösungsmöglichgeit 2: Mit einem Tool namens DBCLEAN.EXE können diese Informationen entfernt werden (hat bei mir auch nicht funktioniert).

Lösungsmöglichkeit 3: Entfernen des Ordners mit dem Microsoft Exchange MAPI Editor (MFCMAPI). Mit diesem Tool können Inhalte von Exchange direkt per MAPI verändert werden.

Lösungsmöglichkeit 4: Die Postfächer der betroffenen Benutzer mit Outlook exportieren, die Postfächer im Exchange löschen und neu anlegen und per Outlook wieder importieren. Zu beachten ist hierbei allerdings, dass beim Löschen des Postfachs mit Hilfe der Exchange-Verwaltungskonsole (ab Exchange 2007) auch gleich der Benutzer mitgelöscht wird. Besser ist es hier, das Postfach vom Benutzer zu trennen und mit Hilfe von Remove-Mailbox in der Exchange Verwaltungsshell zu löschen. Eine ausführliche Beschreibung von Remove-Mailbox ist in der Technet Lib von Microsoft zu finden.

Der Nachteil dieser Lösung: Bei großen Postfächern mit mehreren Gigabyte pro Postfach wird eine derartige Aktion zu einer absoluten Geduldsprobe. Vor allem bei der Kombination aus großem Postfach und Outlook 2010, sind Abstürze mitten im Import/Export-Vorgang nicht ausgeschlossen.

Lösungsmöglichkeit 5: Auch hier werden zunächst die betroffenen Postfächer vom Exchange gelöscht und neu angelegt und danach mit Hilfe der Datensicherung wieder mit Daten bestückt, wobei der Ordner BlackBerryHandheldInfo explizit ausgeklammert wird. Voraussetzung ist allerdings eine Datensicherung mit der Möglichkeit der Wiederherstellung auf Mailbox-Ebene, wie z. Bsp. Symantec Backup mit Exchange Agent. Außerdem sollte mach noch prüfen, welche Daten seit der letzten Sicherung geändert wurden und diese ggf. nochmal getrennt sichern. Diese Lösung hat bei mir letztendlich zum Erfolg geführt.