Announcement

Collapse
No announcement yet.

Tabellendesign: Präsenz als Boolean

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tabellendesign: Präsenz als Boolean

    Hallo,<br>
    <br>
    ich habe eine stark normalisierte DB Struktur, bei der ich folgendes darstellen will:<br>
    Gegeben sei eine Tabelle Personen, eine Tabelle Klassen und eine Tabelle, die Personen und Klassen miteinander verküpft.<br>
    Eine Person kann in mehreren Klassen Mitglied sein, muss aber nicht, sobald die Person Mitglied in einer Klasse ist, wird das dadurch bekannt gemacht, dass in die Verküpfungstabelle ein Eintrag eingefügt wird mit den Primärschlüsseln der beiden Tabellen als Fremdschlüssel.<br>
    Wo ich nicht so recht weiter komme ist die Abfrage dieser Konstruktion. Was ich bräuchte wäre quasi ein Cast auf den Eintrag in der Verknüpfungstabelle als Boolean, wenn es einen Eintrag gibt dann 1, wenn nicht dann 0.<br><br>

    Kann mir da jemand weiter helfen?<br><br>

    Florian

  • #2
    Hallo Florian<br>
    Du kannst so etwas wie: <br>
    <pre>
    select PERSONENNAME, "1"
    FROM PERSON P
    WHERE EXISTS
    ( SELECT 1 FROM KLASSEN K WHERE P.PERSON_ID = K.PERSON_ID )

    UNION ALL

    select PERSONENNAME, "0"
    FROM PERSON P
    WHERE NOT EXISTS
    ( SELECT 1 FROM KLASSEN K WHERE P.PERSON_ID = K.PERSON_ID )
    </pre><br>
    verwenden.<br>
    Alternativ kannst Du das natürlich auch in einer StoredProc schreiben (mit einer EXISTS Abfrage je Datensatz), ist evtl. schneller.<p>
    Luc

    Comment


    • #3
      Hallo Luc,<br>
      <br>
      das funktioniert, liefert aber immer nur einmal pro Person eine 1 zurück.<br>
      Je länger ich darüber nachdenke, desto mehr wird mir klar, dass das, was ich mir vorstelle, nicht gehen kann.<br>
      Ich muß ja Daten, die mir als Spalte vorliegen, in eine Reihe zwingen. Und das Ganze ohne zu wissen, wieviele Datensätze(ergo Spalten) mir die Abfrage zurück liefert.<br>
      <br>
      Trotzdem danke für deine Hilfe.<br>
      <br>
      Floria

      Comment


      • #4
        Hallo Florian,<p>
        das war aber doch Deine Frage... (zumindest habe ich das so verstanden: Ein Bool für jede Person die min. 1 Eintrag in der n:m-Relation hat)<br>

        Was willst Du denn haben?<br>
        Könntest Du das etwas genauer definieren???<p>
        Aus N Records N Spalten machen geht natürlich nicht.<br>
        So etwas kannst Du generell nur auf Clientseite mit eigenen Mitteln (Listview, Stringgrid, o.ä. lösen).<p>
        Luc

        Comment


        • #5
          Luc,

          folgende Tabellen:<pre>

          Tabelle Personen:

          PersID PersName PersVorname
          1 Moore Michael
          2 Bush George
          3 Gore Al
          4 Clinton Bill

          Tabelle Klassen:

          KlasseID KlasseBez
          1 A
          2 B
          3 C
          4 D
          5 E

          Tabelle Verknüpfung:

          VerknID PersID KlasseID
          1 1 1
          2 1 2
          3 1 4
          4 2 1
          5 2 3
          6 2 5
          7 3 2
          8 4 1
          9 4 5
          </PRE>
          Wenn ich jetzt z.B. den Datensatz von M. Moore und George Bush anzeigen lasse, sollte rauskommen:
          <pre>
          Name Vorname Kl_A Kl_B Kl_C Kl_D Kl_E
          Moore Micheal 1 1 0 1 0
          Bush George 1 0 1 0 1
          </pre>
          <br>
          Das Ganze soll auch nicht unbedingt in einer einzigen Query abgefragt werden, ein zweite Query über eine Master/Detail Verknüpfung oder über eine selectable Procedure wäre auch kein Beinbruch.<br>
          <br>
          Wenn die Anzahl und die Namen der Klassen zur Designzeit feststehen, kann ich das ja mit einer SP erschlagen, die Probleme habe ich dann, wenn Klassen im Betrieb dazu kommen können.<br>
          <br>
          Floria

          Comment


          • #6
            Florian,<p>
            wenn ich mich richtig erinnere hatte ich mal auf dem (Ex-)victory-Equitania Newsserver eine solche Lösungsmöglichkeit (auf Clientseite) gepostet.<br>
            Schau mal auf Holgers NG nach (der hat ja alle Equitania-Einträge übernommen).
            Wenn Du es nicht findest, schaue ich mal daheim in meinem SENT-Ordner nach.<p><p>
            Gruss<br>
            Luc

            Comment


            • #7
              Luc,<br>
              <br>
              danke für die Mail, den Newsbeitrag habe ich gefunden.<br>
              Da muß ich mir wohl was anderes überlegen.<br>
              <br>
              Florian<br>
              <br>
              P.S:<br>
              Wieder so ein Fall, wo ich mir eine temporäre Tabelle wünsche. Das Ganze auf dem Client mit einer Stringliste abzubilden, ist ja fast das Gleiche

              Comment


              • #8
                Florian,<p>
                eine temporäre Tabelle bringt Dir da gar nichts.<br>Nochmals: Du kannst NICHT (weder in Firebird noch Interbase noch in sonst einer SQL-DB) eine dynamische Anzahl an Spalten zurückliefern. Diese müssen vorher feststehen. Und das gilt auch bei temporären Tabellen, v.a. da Spalten (im Gegensatz zu Records) nicht ins Unbegrenzte steigen können.<p>
                Luc

                Comment

                Working...
                X