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
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, 3670 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Mac OS X
gelöst Terminal Befehlseingabe liefert nur ein Pfeil nach rechts (5)

Frage von H41mSh1C0R zum Thema Mac OS X ...

Windows Server
MSSQL 2012 User erstellen mit gewissen Berechtigungen (1)

Frage von rabo001 zum Thema Windows Server ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...