Carwyn Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 Mahlzeit, ich steh ein wenig auf dem Schlauch. Aus mir unerfindlichen Gründen ist die Datenbank mit der ich arbeite so gebastelt, dass wenn in einem Zusatzfeld nichts eingetragen wird, dieses Zusatzfeld nicht wie üblich mit einem Nullwert in der DB hinterlegt wird, sondern es gibt dieses Feld + Feldwert in diesem Datensatz einfach nicht. Das ist nur doof wenn ich Datensätze selektieren möchte, bei denen mal dieses Feld gefüllt ist und mal nicht. Momentan kriege ich nur die raus, die etwas im Feld stehen haben, denn dann gibt es zu dem Datensatz bei dem Feld ja auch die Zeile "Feldname - Wert". Gibt es eine Möglichkeit wie "If exist" oder so, dass auch die Fälle mit ausgegeben werden, in denen das Feld nicht vorhanden ist? Ich hoffe es ist klar, was ich meine. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 Wenn Du uns verräst welche DBMS so verquert denk, dann kann man dir vielleicht auch helfen. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Carwyn Geschrieben 22. September 2010 Autor Teilen Geschrieben 22. September 2010 Es geht um eine Oracle-Datenbank. Allerdings wird Oracle da am wenigsten Schuld haben, sondern die Applikation, die anscheinend pro Datensatz nur die eingetragenen Felder zum Speichern in der DB weitergibt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 Jetzt komme ich gar nicht mehr mit. Was denn jetzt für eine Applikation? Und was hat die mit deinem Select Befehl auf der DB zu tun? Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Carwyn Geschrieben 22. September 2010 Autor Teilen Geschrieben 22. September 2010 *g* Okay, ich sehe schon, dass ich mich zu kurz gehalten habe. Also die Applikation ist ein Informationmanager, in dem unterschiedlichste Anwendungen laufen für das Personalmanagement, die Fortbildung, Terminmanagement, Kundendatenbank, etc. pp. In dem System wird vornehmlich mit einem Konstrukt gearbeitet, dass sich Vorgang nennt. Im Grunde nichts anderes als Masken, die Aktionen beinhalten, welche an andere Nutzer im System weitergegeben werden, um einen bestimmten Bearbeitungsschritt durchzuführen. Quasi eine Form von Workflow. Diese Masken können erstellt und mit Zusatzfeldern versehen werden. Jeder Vorgang wird in einer Tabelle in der Datenbank festgehalten. Die Zusatzfelder liegen wiederum in einer anderen Tabelle, mit einer Verknüpfung zum Vorgang. Ein Zusatzfeld in meinem Beispiel ist ein Textfeld, in dem eine Information eingegeben kann, die nicht unbedingt immer vorliegt. Das Feld ist optional und muss nicht zwingend befüllt werden. Nun hinterlegt das System in der Zusatzfeldtabelle die Zusatzfelder zum jeweiligen Vorgang. Ist besagtes Feld nicht befüllt worden, wird nicht eine Zeile mit FELDID und NULL angelegt, sondern für diesen Vorgang existiert das Feld nicht. Es sei denn es wird irgendwann befüllt. Dann wird es auch in die Zusatzfeldtabelle geschrieben. Ich möchte jedoch eine Liste bestimmter Vorgänge per SQL auslesen, in denen allerdings das Feld nicht gezwungenermaßen gefüllt sein muss. Dummerweise ist allerdings in der Abfrage natürlich ein "Where FeldID = 123456" enthalten. Wenn es aber bei dem Datensatz keine FeldID gibt, die 123456 ist, wird natürlich dieser Vorgang nicht der Liste hinzugefügt, weil er den Selektionskriterien nicht entspricht. Deswegen die Frage, ob es da eine Möglichkeit gibt, dennoch alle Vorgänge in der Selektion zu finden, also im SQL Statement diese eine WHERE-Bedingung bspw. optional zu machen? Dass ich das über die WHERE-Klausel machen muss liegt im übrigen an dem grundsätzlichen Aufbau des Datenmodells, auf das ich leider keinen Einfluss habe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FISI from Hell Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 Und du kannst nicht einfach mit der Eintragung des Vorgangs in die Datenbank auch den Eintrag in die Zusatztabelle machen? Wenn kein Eintrag existiert, dürfte bei der Vorgangstabelle auch kein verweis sein, also dürfte das in etwa so aussehen: where vorgangstabelle.verweis is not null and vorgangstabelle.verweis=zusatztabelle.id or vorgangstabelle.verweis is null Ich hoffe du hast mich verstanden und ich konnte dir helfen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
AnimaLunae Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 So wie ich das verstehe ist die Verknüfung nicht in der Vorgangstabelle drin, sondern in der Zusatzfeldtabelle. In einer Zusatzfeldtabelle können dann mehrere Zeilen zu einem Vorgang stehen - für jedes Zusatzfeld eine, also 1:n Kardinalität Du willst also alles zurückbekommen, bei dem das Zusatzfeld 9876 den Wert 1234 hat oder bei dem das Zusatzfeld nicht definiert ist. Mit Subselects würde mir sowas einfallen: SELECT * FROM vorgang WHERE ...... AND vorgang_id NOT IN ( SELECT vorgang_id FROM zusatzfeld WHERE feld_id = 9876 AND feld_inhalt != 1234 ) Könnte allerdings etwas ineffizient sein - keine Ahnung. Ohne konkrete Angaben was das Query machen soll und sonst noch selektieren, wirds vielleicht eh etwas schwer. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
AnimaLunae Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 Evtl geht auch ein left join, falls die Datenbanken sowas in der Form unterstützen. Ich kenns allerdings bei Joins nur, dass im Join Schlüssel von Tabellen miteinander verglichen werden SELECT * FROM vorgang LEFT JOIN zusatzfeld ON ( zusatzfeld.vorgang_id = vorgang.vorgang_id AND zusatzfeld.feld_id = 9876 ) WHERE .... AND (zusatzfeld.feld_inhalt IS NULL OR zusatzfeld.feld_inhalt = 1234 ) jetzt hast du in zusatzfeld.feld_inhalt ein NULL wenn es nicht vorkommt - in der Theorie. Eigentlich bin ich mit Joins auf dem Kriegsfuss, deshalb ist das keine Lösung sondern nur Denkanstoss... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 Auch ein left join wird ihr in dem Fall nicht helfen. Soweit ich das noch weiß, führt ein left join in der Ergebnisemenge der "linken" Menge auf und überall wo dazu keine passenden Felder in der "rechten" Menge gefunden werden konnte, werden die Felder mit null angezeigt. In einem normalem join würden die Felder ja weggelassen. @Carwyn; Was die Anwendung da macht, ist ja an sich auch garnicht so verkehrt. Zusatzfelder die ansonsten über eine extra Zeile in der Zusatzfeldertabelle gespeichert werden müssen, werden einfach weggelassen wenn sie nichts beinhalten. Das dürfte ja Platzsparen. Damit die Anwendung aber selber weiß, welche Zusatzfelder ein Vorgang haben kann, dürfte doch aber bestimmt irgendwo noch gespeichert sein, was für Felder ein Vorgang so kennt. Hast du mal noch sowas geschaut? Wenn es für die Informationen noch eine Tabelle gibt, dürfte sich doch darüber ein SELECT basteln lassen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MartinSt Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 Wie sind denn die Zusatzfelder dem Vorgang zugeordnet, über eine VorgangsID oder ähnliches? Warum kannst du nicht über diese ID joinen? Gruß Martin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 22. September 2010 Teilen Geschrieben 22. September 2010 (bearbeitet) kannst du die Tabellen Struktur bitte grob umreisen ? Soweit ich das les wäre das für mich ein standard left join. (right oder left is eh das gleiche, mal die linke menge, mal die rechte menge....) Gruß Sven Bearbeitet 22. September 2010 von streffin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.