Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Zugehörige Datensätze finden...

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Jack123, 18 Dezember 2012.

  1. Jack123

    Jack123 Neuer Benutzer

    Hallo,
    Ich stehe mal wieder vor einem Problem:
    Drei Tabellen:

    Tabelle [groups]:
    Code:
    id - Name    - weitere infos - ...
    1  - Gruppe 1 - ... - ...
    2  - Gruppe 2 - ... - ...
    3  - Gruppe 3 - ... - ...
    
    Tabelle [templates]
    Code:
    id - id_groups - id_team
    1  -    1      -  100
    2  -    1      -  200
    3  -    2      -  100
    4  -    3      -  200
    Tabelle [templates]
    Code:
    id  - Name
    ...
    100 - Team 100
    ...
    200 - Team 200
    ...
    Aufgabenstellung ist hier, eine Abfrage zu finden, die mir folgendes ausgibt:

    Für id_team = 100:
    Code:
    id_Gruppe - selected
      1      -    1
      2      -    1
      3      -    0
    Für id_team = 200:
    Code:
    id_Gruppe - selected
      1      -    1
      2      -    0
      3      -    1
    Es sollen also, für alle Einträge in [groups] geprüft werden, ob es in [templates] einen zugehörigen Datensatz gibt, wenn ja: dann soll in selected eine "1", sonst eine "0". Ein Datensatz existiert, wenn id_team = 100 bzw. 200 (über WHERE vermutlich...) und id_groups = id vom aktuellen Datensatz aus [groups] in einem oder mehreren Datensätzen vorhanden ist.

    selected = 0 bzw 1 ist nicht fest, es könnte auch 0 bzw >0 oder irgendwas anderes unterscheidbares sein.

    Ich hoffe ich habe es verständlich erklärt.

    Vielen Dank für die Hilfe!

    mfg Florian
     
  2. ukulele

    ukulele Datenbank-Guru

    Zunächst mal hast du oben zwei Tabellen gleichen Namens beschrieben, ich nenne die erste einfach mal z_templates da es sich ja offensichtlich um eine reine Zwischentabelle zwischen templates und groups handelt. Dann könnte das ganze so aussehen:
    Code:
    SELECT    g.*
            (    CASE
                WHEN    z.id_team = 100
                AND        t.Name IS NOT NULL
                THEN    1
                ELSE    0
                END ) AS selected
    FROM    groups g
    LEFT JOIN z_templates z ON z.id_groups = g.id
    LEFT JOIN templates t ON t.id = z.id
    
    Jetzt bin ich mir aber nicht sicher ob es überhaupt notwendig ist die Tabelle templates noch zu joinen und auf t.Name IS NOT NULL zu prüfen. Eigentlich müsste die Tatsache, das ein Eintrag in z.templates mit der id_team = 100 existiert schon beweisen, das auch ein Template vorhanden ist. Das kann ich aber nicht so gut beurteilen :)
     
  3. Tommi

    Tommi Datenbank-Guru

    Hi,

    ich steh ja so absolut auf's Allgemeine. Ich hätte das wohl so gelöst:

    Code:
    SELECT G.id as Gruppe_ID,
    G.Name as Gruppenname,
    T.id as Team_ID,
    T.Name as Team,
    (CASE WHEN Z.id IS NOT NULL THEN 1 ELSE 0 END) as Selected
    FROM groups G
    CROSS JOIN teams T
    LEFT OUTER JOIN templates Z
         ON G.id=Z.id_groups
         AND T.id=Z.id_team
    WHERE T.id=100
    
    Das Select verbindet alle Teams mit allen Gruppen und prüft die Zugehörigkeit in templates.
    Daraus kann man z.B. eine View machen (dann ohne WHERE-Klausel) und diese dann entsprechend der Team- oder auch Gruppen-Einschränkung mittels WHERE abfragen.

    Viele Grüße,
    Tommi
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden