Top-Themen

Aktuelle Themen (A bis Z)

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
GELÖST

MSSQL 2000 / WHERE liefert ein paar Duplikate / Duplikate in Query Ergebnis gleich rauslassen

Frage Entwicklung Datenbanken

Mitglied: flash-gordon

flash-gordon (Level 1) - Jetzt verbinden

05.01.2007, aktualisiert 21:04 Uhr, 3696 Aufrufe, 5 Kommentare

Der Biber wird sich jetzt wieder an VERENDE festbeissen, aber......

folgendes:


01.
 WHERE ( (VERTRAG.VERENDE IS NULL  OR VERTRAG.VERENDE>= Getdate())
prüft ob ein Vertrag noch läuft, oder ob er ein NULL Wert enthält, dann ist es ein Vertrag ohne Enddatum. Eigentlich sollen beide Arten im Ergebnis erscheinen, aber jedoch nur einmal für eine Person.

Bedingung: wenn eine Person 2 Verträge hat, dann soll der mit dem NULL Wert genommen werden.

Die Personen werden wie folgt abgefragt:

01.
SELECT  
02.
 
03.
 PGRDAT.ZIMMER as "wic_uid" 
04.
 
05.
 FROM  L2001.PGRDAT  PGRDAT
Ich hab es mit UNION versucht, indem ich die o.g. Prüfung 2 geteilt hab. Hat aber nicht geklappt. Duplikate waren danach immernoch vorhanden.

HILFE!
Mitglied: Biber
05.01.2007 um 15:29 Uhr
Moin flasch-gordon,

nachdem Du ja das Umlaut-Problem selbst in den Griff bekommen hast, würde ich ja gern hier mit an einer Lösung basteln.

Grundsätzlich würde dieses Theater mit diesem VERRECKE/VERENDE-Feld gar nicht so massiv auftreten, wenn Ihr in Eurer DB von vornherein mit einem Dummy-Wert von "31.12.9999" oder ähnlich für "Kein Vertragsende festgelegt" gearbeitet hättet.
Dann ließe sich hier wie auch im letzten Thread ganz einfach mit Max() selektieren.

So bleibt als zweitbeste Variante wirklich nur ein UNION.

Verbal / Pseudo-SQL:

01.
Select ....  from Vertrag, PGRDAT 
02.
WHERE ( VERTRAG.VERENDE>= Getdate() AND ...[PGRDAT-VERTRAG-Verknüpfung]) 
03.
UNION 
04.
Select ....  from Vertrag, PGRDAT 
05.
WHERE ( (VERTRAG.VERENDE IS NULL  AND ...[PGRDAT-VERTRAG-Verknüpfung] 
06.
And PGRDAT.ZIMMER NOT in (  
07.
   Select PGRDAT.ZIMMER from Vertrag, PGRDAT 
08.
   WHERE ( VERTRAG.VERENDE>= Getdate() AND ....) 
09.
)
Was hier noch fehlt, sind die zusätzlichen WHERE-Bedingungen, die die VERTRAG und die PGRDAT-Tabelle miteinander verbinden.
Also bitte nicht so abschicken, sonst hast Du mit Sicherheit ein kartesisches Produkt.
Wie hängen die beiden denn zusammen?

Gruß
Biber
P.S. PGRDAT ist auch ein schöner Tabellenname- habt er den Kram 1:1 von dBaseIII migriert?
Bitte warten ..
Mitglied: flash-gordon
05.01.2007 um 15:48 Uhr
sollte ich dir mal die ganze query zukommen lassen?!

Die DB ist leider bestandteil eines externen Tools, welches ein deutscher Dienstleister über Jahre "weiterentwickelt".

Das das Teil von irgendeiner alten dBase Geschichte stammt, möchte ich gar nicht mal ausschließen.

hier also die ganze bisherige Query, die die Duplikate mit 2 Verträgen ausgibt:

01.
select 
02.
 
03.
 PGRDAT.ZIMMER as "wic_uid", 
04.
 VERTRAG.PNR as "wic_hrid",  
05.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_civility", 
06.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.NANAME, 'ö', 'ö'), 'ä','ä'),'ü','ü'),'ß','ß'),'Ö','Ö'),'Ä','Ä'),'Ü','Ü')as "wic_name", 
07.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_name2", 
08.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.VORNAME, 'ö', 'ö'), 'ä','ä'),'ü','ü'),'ß','ß'),'Ö','Ö'),'Ä','Ä'),'Ü','Ü')as "wic_firstname", 
09.
 PGRDAT.VOLLHGB as "wic_marital_status",  
10.
 PGRDAT.BETRST as "wic_etablishment",  
11.
 MAKST.KST as "wic_cost_center", 
12.
 CONVERT(varchar(8), MITARBDAT.KONEINTRT, 112) as "wic_rights_beginning", 
13.
 IsNull(CONVERT(varchar(8), VERTRAG.VERENDE, 112), '00000000')  as "wic_rights_end", 
14.
 PGRDAT.ATSTATUS as "wic_manager",  
15.
 PGRDAT.GRUPPE as "wic_hrid_manager", 
16.
 BSTLAND.LND_ISO31662 as "wic_countable_country", 
17.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_number", 
18.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.STRASSE, 'ö', 'ö'), 'ä','ä'),'ü','ü'),'ß','ß'),'Ö','Ö'),'Ä','Ä'),'Ü','Ü')as "wic_street", 
19.
 IsNull(PGRDAT.COADR, '')  as "wic_adress_complement", 
20.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.ORT, 'ö', 'ö'), 'ä','ä'),'ü','ü'),'ß','ß'),'Ö','Ö'),'Ä','Ä'),'Ü','Ü')as "wic_town", 
21.
 PGRDAT.PLZ as "wic_post_code",  
22.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_province", 
23.
 BSTLAND.LND_ISO31662 as "wic_country" 
24.
 
25.
 FROM  L2001.PGRDAT  PGRDAT,  
26.
  L2001.VERTRAG  VERTRAG,  
27.
  L2001.MITARBDAT  MITARBDAT,  
28.
  L2001.BST  BST,  
29.
  L2001.LAND  BSTLAND,  
30.
  L2001.MAKST  MAKST 
31.
  
32.
 WHERE MITARBDAT.AK = VERTRAG.AK AND MITARBDAT.MAN = VERTRAG.MAN AND MITARBDAT.PNR =  VERTRAG.PNR 
33.
 AND PGRDAT.AK = MITARBDAT.AK AND PGRDAT.PNR = MITARBDAT.PNR AND PGRDAT.MAN =  MITARBDAT.MAN 
34.
 AND PGRDAT.AK = VERTRAG.AK AND PGRDAT.PNR = VERTRAG.PNR AND PGRDAT.MAN = VERTRAG.MAN 
35.
 AND BST.AK = PGRDAT.BSTAK AND BST.BST = PGRDAT.BETRST AND BST.MAN = PGRDAT.BSTMAN 
36.
 AND BST.LND = BSTLAND.LND 
37.
 AND VERTRAG.AK = MAKST.AK AND VERTRAG.MAN = MAKST.MAN AND VERTRAG.PNR = MAKST.PNR   
38.
 AND VERTRAG.VERTNR = MAKST.VERTNR 
39.
 AND PGRDAT.PST_AB  <= Getdate() AND PGRDAT.PST_BIS  >= Getdate()   
40.
 AND VERTRAG.VER_AB  <= Getdate() AND VERTRAG.VER_BIS  >= Getdate()   
41.
 AND MITARBDAT.MA_AB  <= Getdate() AND MITARBDAT.MA_BIS  >= Getdate()   
42.
 AND BST.BST_AB  <= Getdate() AND BST.BST_BIS  >= Getdate()   
43.
 AND MAKST.MK_AB  <= Getdate() AND MAKST.MK_BIS  >= Getdate()   
44.
 AND VERTRAG.VERENDE>= Getdate() 
45.
 AND VERTRAG.BESCHSCHL NOT IN ('Kufri25','Kufri')  
46.
 
47.
UNION 
48.
 
49.
SELECT  
50.
 
51.
 
52.
 PGRDAT.ZIMMER as "wic_uid", 
53.
 VERTRAG.PNR as "wic_hrid",  
54.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_civility", 
55.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.NANAME, 'ö', '&#x00F6;'), 'ä','&#x00E4;'),'ü','&#x00FC;'),'ß','&#x00DF;'),'Ö','&#x00D6;'),'Ä','&#x00C4;'),'Ü','&#x00DC;')as "wic_name", 
56.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_name2", 
57.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.VORNAME, 'ö', '&#x00F6;'), 'ä','&#x00E4;'),'ü','&#x00FC;'),'ß','&#x00DF;'),'Ö','&#x00D6;'),'Ä','&#x00C4;'),'Ü','&#x00DC;')as "wic_firstname", 
58.
 PGRDAT.VOLLHGB as "wic_marital_status",  
59.
 PGRDAT.BETRST as "wic_etablishment",  
60.
 MAKST.KST as "wic_cost_center", 
61.
 CONVERT(varchar(8), MITARBDAT.KONEINTRT, 112) as "wic_rights_beginning", 
62.
 IsNull(CONVERT(varchar(8), VERTRAG.VERENDE, 112), '00000000')  as "wic_rights_end", 
63.
 PGRDAT.ATSTATUS as "wic_manager",  
64.
 PGRDAT.GRUPPE as "wic_hrid_manager", 
65.
 BSTLAND.LND_ISO31662 as "wic_countable_country", 
66.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_number", 
67.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.STRASSE, 'ö', '&#x00F6;'), 'ä','&#x00E4;'),'ü','&#x00FC;'),'ß','&#x00DF;'),'Ö','&#x00D6;'),'Ä','&#x00C4;'),'Ü','&#x00DC;')as "wic_street", 
68.
 IsNull(PGRDAT.COADR, '')  as "wic_adress_complement", 
69.
 replace(replace(replace(replace(replace(replace(replace(PGRDAT.ORT, 'ö', '&#x00F6;'), 'ä','&#x00E4;'),'ü','&#x00FC;'),'ß','&#x00DF;'),'Ö','&#x00D6;'),'Ä','&#x00C4;'),'Ü','&#x00DC;')as "wic_town", 
70.
 PGRDAT.PLZ as "wic_post_code",  
71.
 REPLACE(VER_BAUAZ, '0', '') AS "wic_province", 
72.
 BSTLAND.LND_ISO31662 as "wic_country" 
73.
 
74.
 FROM  L2001.PGRDAT  PGRDAT,  
75.
  L2001.VERTRAG  VERTRAG,  
76.
  L2001.MITARBDAT  MITARBDAT,  
77.
  L2001.BST  BST,  
78.
  L2001.LAND  BSTLAND,  
79.
  L2001.MAKST  MAKST 
80.
  
81.
 WHERE MITARBDAT.AK = VERTRAG.AK AND MITARBDAT.MAN = VERTRAG.MAN AND MITARBDAT.PNR =  VERTRAG.PNR 
82.
 AND PGRDAT.AK = MITARBDAT.AK AND PGRDAT.PNR = MITARBDAT.PNR AND PGRDAT.MAN =  MITARBDAT.MAN 
83.
 AND PGRDAT.AK = VERTRAG.AK AND PGRDAT.PNR = VERTRAG.PNR AND PGRDAT.MAN = VERTRAG.MAN 
84.
 AND BST.AK = PGRDAT.BSTAK AND BST.BST = PGRDAT.BETRST AND BST.MAN = PGRDAT.BSTMAN 
85.
 AND BST.LND = BSTLAND.LND 
86.
 AND VERTRAG.AK = MAKST.AK AND VERTRAG.MAN = MAKST.MAN AND VERTRAG.PNR = MAKST.PNR   
87.
 AND VERTRAG.VERTNR = MAKST.VERTNR 
88.
 AND PGRDAT.PST_AB  <= Getdate() AND PGRDAT.PST_BIS  >= Getdate()   
89.
 AND VERTRAG.VER_AB  <= Getdate() AND VERTRAG.VER_BIS  >= Getdate()   
90.
 AND MITARBDAT.MA_AB  <= Getdate() AND MITARBDAT.MA_BIS  >= Getdate()   
91.
 AND BST.BST_AB  <= Getdate() AND BST.BST_BIS  >= Getdate()   
92.
 AND MAKST.MK_AB  <= Getdate() AND MAKST.MK_BIS  >= Getdate()   
93.
 AND VERTRAG.VERENDE IS NULL 
94.
 AND VERTRAG.BESCHSCHL NOT IN ('Kufri25','Kufri') 
Bitte warten ..
Mitglied: flash-gordon
05.01.2007 um 19:06 Uhr
ICH HABS.

Dein Ansatz war super. Nur leider war (mein Fehler) der Schlüssel nicht PGRDAT.ZIMMER, sondern VERTRAG.PNR

Demnach:
01.
 
02.
AND ( (VERTRAG.VERENDE IS NULL  AND 
03.
 VERTRAG.PNR NOT in (  
04.
   Select VERTRAG.PNR from Vertrag, PGRDAT 
05.
   WHERE ( VERTRAG.VERENDE>= Getdate()
vielen vielen Dank Biber!
Bitte warten ..
Mitglied: Biber
05.01.2007 um 20:25 Uhr
Umso besser, flash-gordon,

Wenn Du es ausgeknobelt hast.
Bei SQL-Statements sind bei mir oft auch die Grenzen der Abstraktionsfähigkeit erreicht - ganz ohne Probieren alles einfach runterschreiben mach ich da ungern.

Drei Sachen wollte ich noch anregen:

- das Zeitverhalten dieser Abfrage dürfte absolut grottig sein. Ich empfehle Dir nochmal die Prüfung (und ggf. interne Diskussion), ob ihr für diesen Vertrags-Ablauf einen definierten HIGHVALUE-Wert einführen könnt (also ein "Monddatum" 31.12.2099 oder 31.12.9999).
Wenn es die Client-Appz weiß (und genau diesen Wert prüfen und richtig interpretieren kann), dann wäre es SQL-technisch wesentlich einfacher, performanter und wartbarer. Und ob Du ein "offenes Vertragsende" anzeigst als "00000000" oder "99991231"... das ist beides gleich hässlich.

- Plan B: Wenn das nicht geht, weil ihr da noch irgendwelche Lizenzknebeln bis zum Jahr 2023 habt mit dieser DB und da nix Großes ändern dürft, dasn würde ich dieses Statement nicht Clientseitig zusammenschroten und über die Leitung schicken, sondern die Arbeit durch eine kleine Stored Procedure serverseitig abfackeln. Bringt erstens eine Menge Performance und zweitens, so wie diese DB aussieht, ist einer der Grundgedanken von sauberen SQL-Schnittstellen verletzt: jede doofe Client-Application muss bis ins letzte physikalische Detail die Tabellenstrukturen und -relationen kennen. Das kostet nicht nur Performance, sondern auch richtig Geld - weil die ganze Logik clientseitig nachgekaspert bzw. entwickelt werden muss.
Dann lieber ein STP GibMirAlleAktuellenVerträge() mt einem definierten Resultset und gut.

- und wo ich mir ja schon vorhin auf die Lippen gebissen habe.... ääähm... hat diese DB denn auch so etwas wie VIEWs oder gar ein logisches Datenmodell? Solche Statements wie oben sind ja hart der Grenze der Wartbarkeit - ich würde diese ganzen verknibbelten Statements, also beispielsweise alles im ersten SELECT... FROM ....bis UNION als EINEN View definieren.
Dann bleibt vom ganzen Geraffel oben nur noch ein 5-Zeiler übrig:

01.
SELECT * from AlleAktuellenVertraege where VERENDE>= Getdate() 
02.
UNION 
03.
SELECT * from AlleAktuellenVertraege  
04.
   where VERENDE is NULL  
05.
    and PNR not in (SELECT * from AlleAktuellenVertraege where VERENDE>= Getdate())
Halte ich für wartbarer.

Grüße
Biber
Bitte warten ..
Mitglied: flash-gordon
05.01.2007 um 21:04 Uhr
Hallo Biber,

ich hab mich schon oft über dieses "System" aufgeregt und den Wechsel angestrebt.

Aber mein CFO sieht natürlich nur das bereits investierte Geld und die bislang zuverlässigen Ergebnisse.

ZUm Client. Das Tool wird alle 3 Monate upgedatet und der Client hat mittlerweile 3 MB Festplatenspeicher für sich beansprucht.

Nach der letzten (absolut überflüssigen) Look & Feel Restaurierung der Benutzeroberfläche, ist das ganze aufgrund deiner genannten Gründe und einer Menge schwachsinniger Slide Effekte absolut unproduktiv.

Mal ganz abgesehen von der Performance, die der Server für nur eine DB bereitstellen muss.

Was die Geschichte mit den Views und Procedures angeht: hab ich natürlich so realisiert. Sofern man sich "onsite" befindet liefert der Server das Ergbnis via View in 2 sec.

Da das ganze nachts, scheduliert läuft und direkt ein XML flow in eine remote DB schreibt. Alle i.O.

Ich werde jedoch im nächsten Gespräch mit dem Provider und meinem CFO ein paar deiner Kommentare zur DB Konstruktion mit in die Disko einbringen.

dank dir nochmal!
Bitte warten ..
Ähnliche Inhalte
Datenbanken
MSSQL: Where durch Variable ändern
gelöst Frage von PCFJKGDatenbanken11 Kommentare

Ich versuche in Abhängigkeit von einer Variablen eine Abfragebedingung zu ändern: SELECT COUNT(*) FROM SQL-Tabelle WHERE IIF (@Variable IS ...

Datenbanken
MSSQL xml Query - wie?
Frage von TiCarDatenbanken1 Kommentar

Hi, ich habe beispielhaft folgende SQL Code Ergebnis: <leer> Wenn es allerdings so aussieht: Ergebnis: <TrackingNumber>1Z99R3X96865403082</TrackingNumber> Da der XML ...

Outlook & Mail
Outlook Suche liefert kein Ergebnise mehr
Frage von Bjoern-BOutlook & Mail9 Kommentare

Hallo Zusammen, wir haben einen User, bei dem die Suche in Outlook keine Ergebnisse mehr liefert. Im Detail, der ...

Windows Server
Php-Script über Aufgabenplanung liefert anderes Ergebnis als direkt gestartet - WinSrv2008R2(64Bit)
gelöst Frage von cubixxWindows Server5 Kommentare

Werte Community, danke für die Zeit zum Lesen meines Problems. Ich habe eine batch-Datei, die eine php-website über den ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 4 StundenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 9 StundenWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 9 StundenWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 21 StundenInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless19 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...

Windows Server
Remotesteuerung der Sitzung (Kennung XX) fehlgeschlagen
gelöst Frage von Stefan91Windows Server14 Kommentare

Hallo Zusammen, seit kurzem bekomme ich oben genannte Fehlermeldung, wenn ich versuche eine Remotesitzung über den Taskmanager fernzusteuern (Rechtsklick ...