Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Abfrage Die letzten Einträge einer Tabell anzeigen (Distinct)

Frage Entwicklung Datenbanken

Mitglied: K.Danger

K.Danger (Level 1) - Jetzt verbinden

18.02.2010, aktualisiert 11:14 Uhr, 4812 Aufrufe, 1 Kommentar

Ich würde mich über eine Gedächnisstütze zu folgender Problematik freuen:

Das Problem liegt in der korrekten & sinnvollen Formulierung der SQL Abfrage (MS SQL 2008).

Das Scenario:

Benutzer der Datenbank betrachten & bearbeiten eine Hand voll verschiedener Tabellen. z.B. Kunden, Aufträge, Mitarbeiter, ....

Da die Benutzer oft schnell (Anruf) in einen kürzlich bearbeiteten Datensatz springen soll (über eine entsprechende Front End Applikation) möchte ich dem jeweiligen Benutzer anzeigen lassen was er/sie zuletzt geöffnet hatte.

Zu diesem Zweck habe ich eine Tabelle angelegt die in etwas so aussieht:

id int --> Identitätsspezifikation (step 1) & Primärschlüssel
datum smalldatetime
benutzer varchar(50)
dokumenttyp char(1)
dokumentnummer int
zugriffstyp int

das datum soll auf die Minute den Zugriffszeitpunkt abscpeichern
benutzer ist der windows-Anmeldename
dokumenttyp ist z.B. 'k' für Kunde, 'a' für Auftrag usw.
dukumentnummer ist die ID des entsprechenden dokumenttyps
zugriffstyp 0- nur öffnen, 1 - ändern


Ich würde nun gerne eine Liste hieraus erhalten die den letzten Eintrag für einen Benutzer zuerst anzeigt ABER keine Doppelteinträge anzeigt. Also nur den LETZTEN ZUGRIFF auf den Datensatz wiedergibt. Das Datum sollte auch angezeigt werden. (Einträge der letzten 5 Tage)


Ich hatte nach einigem Gebastel eine funktionierende Lösung gefunden ( in diesem Fall soll nur der dokumenttyp Mitarbeiter angezeigt werden - mit einer Tabelle Mitarbeiter verknüpft):


SELECT x.nachname,x.vorname,y.datum,x.manr
FROM tbl_mitarbeiter x
INNER JOIN (SELECT TOP 100 PERCENT a.datum , a.dokumentnummer from base_zugriffe a INNER JOIN (SELECT MAX(id) As id FROM base_zugriffe WHERE benutzer LIKE '%" & Benutzer & "%' Group By dokumentnummer ) b on a.id=b.id where a.datum>'" & Date.Now.AddDays(-5) & "' AND dokumenttyp='m' order by a.datum DESC) y ON x.manr=y.dokumentnummer where x.nachname !='' order by y.datum DESC


jedoch entschleunigt diese den Datenbakzugriff erheblich! Diese Abfrage ist nach viel Trail & Error eroiert worden.... daher wohl unschön.

Ich würde mich über eine viel clevere Alternative freuen!

Vielen Dank im Voraus

Klaas
Mitglied: MadMax
18.02.2010 um 14:23 Uhr
Hallo Klaas,

erst mal vorab:
1. Ich arbeite mit SQL Server 2005, kann also sein, daß da noch was für SQL Server 2008 angepaßt werden müßte oder optimiert werden könnte.
2. Was ich da unten schreibe ist ungetestet, weil ich Deine Tabellen nicht da habe.

So, jetzt zur Abfrage:
Zwei Möglichkeiten fallen mir ein, welche die schnellere ist, müßtest Du ausprobieren. Nach meiner Erfahrung ist die Variante 1 meistens die schnellere, aber nicht immer.

Variante 1:
01.
select	m.nachname, 
02.
	m.vorname, 
03.
	z1.datum, 
04.
	m.manr 
05.
from	tbl_mitarbeiter m 
06.
	join base_zugriffe z1 on m.manr = z1.dokumentnummer 
07.
where	z1.id = (select	top 1 z2.id 
08.
		from	base_zugriffe z2 
09.
		where	z2.dokumentnummer = z1.dokumentnummer and 
10.
			z2.benutzer like '%Benutzer%' and 
11.
			z2.datum > dateadd (d, -5, convert (datetime, convert (varchar (50), getdate (), 112), 112)) and 
12.
			z2.dokumenttyp = 'm' 
13.
		order by z2.datum desc) and 
14.
	m.nachname != '' 
15.
order by z1.datum desc
Variante 2:
01.
select	m.nachname, 
02.
	m.vorname, 
03.
	z.datum, 
04.
	m.manr 
05.
from	tbl_mitarbeiter m 
06.
	join (	select	*, row_number () over (partition by benutzer, dokumenttyp, dokumentnummer order by datum desc) sortnr 
07.
		from	base_zugriffe 
08.
		where	benutzer like '%Benutzer%' and 
09.
			datum > dateadd (d, -5, convert (datetime, convert (varchar (50), getdate (), 112), 112)) and 
10.
			dokumenttyp = 'm' 
11.
		) z on m.manr = z.dokumentnummer and z.sortnr = 1 
12.
where	m.nachname != '' 
13.
order by z.datum desc
"partition by benutzer, dokumenttyp, dokumentnummer" könnte hier durch "partition by dokumentnummer" ersetzt werden, weil ja auf benutzer und dokumenttyp eingeschränkt wird, aber sobald nach z.B. mehreren Dokumenttypen gesucht wird, braucht man das schon wieder.

Gruß, Mad Max
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Webbrowser
Fenster und Tabs der letzten Sitzung anzeigen (3)

Frage von EwaldST zum Thema Webbrowser ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...