Zum Inhalt springen

[SQL] Selektion bei evtl. nicht vorhandenen Feldern


Carwyn

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

*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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...