Ankündigung

Einklappen
Keine Ankündigung bisher.

Join - wahrscheinlich zum 100.000ten Mal...

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Join - wahrscheinlich zum 100.000ten Mal...

    Hallo,

    ich kapier es leider wieder mal nicht und brauche Eure Hilfe.

    Ich habe zwei Tabellen:

    Tabelle Produkte
    id produkt_key
    1 a
    2 b
    Tabelle Aktivitaeten
    id produkt_key ma_key
    1 a 1
    2 b 1
    3 a 3
    Ich möchte jetzt eine Liste aller Produkte haben, wobei die Produkte immer komplett ausgegeben werden sollen. In einer weiteren Spalte soll stehen, ob der entsprechende ma_key in der Tabelle aktivitaet enthalten ist oder nicht.

    Ich mache bisher:

    SELECT p.produkt_key, a.ma_key FROM Produkte p
    left JOIN aktivitaeten a on a.produkt_key = p.produkt_key
    where a.ma_key = 2

    Der ma_key 2 hat noch keine Aktivität, die Produktliste soll dennoch vollständig kommen. Sprich das Ergebnis sollte so aussehen:

    +-------------+--------+
    | produkt_key| ma_key |
    +-------------+--------+
    | a | null |
    | b | null |
    +-------------+--------+



    Beim ma_key 3 soll das Ergebnis so aussehen:

    +-------------+--------+
    | produkt_key| ma_key |
    +-------------+--------+
    | a | 3 |
    | b | null |
    +-------------+--------+



    Mit welchem Join bekomme ich das hin? Vielen Dank für Eure Hilfe...

  • #2
    Dein Join ist richtig. Das Problem ist die Where Clause.
    Lässt Du sie weg, erhälst Du das gewünschte Ergebnis.

    Dieses Problem tritt häufig bei Unachtsamkeit in der SQL Formulierung auf (oder beim Lernen von SQL, wenn diese Konzepte noch nicht geläufig sind).

    Ich übersetzte mal Dein Beispiel Select in deutsche Prosa:
    Gib mir die Werte p.produkt_key, a.ma_key von Tabelle Produkte und aktivitaeten verbunden über Spalte Produkt_key und zwar egal, ob passende MA Werte existieren.
    Von dieser Menge jedoch bitte nur die, deren MA_KEY genau gleich 2 ist.

    Also

    JOIN macht die Verknüpfung und ordnet Wertepaare aus Spalten zu oder lässt Lücken (NULL Werte!) im Ergebnis,
    wenn passende Werte fehlen (hier: LEFT JOIN)

    WHERE ist ein Filter, der anschließend angewendet wird und alles rauswirft (gleich Zeilen-weise!),
    was den aufgeführten Bedingungen NICHT entspricht.


    Abhilfe
    WHERE Bedingungen, die eigentlich kein Filter sind, sondern ein Join Kriterium, müssen in die JOIN Clause verschoben werden.

    Andersherum:
    Wenn
    - ein spezieller gefilterteter Wert in der Where Clause gesucht werden muss und
    - dieser Wert gehört zum "offenen Teil" des Joins, also den Spalten, die Null sein können und
    - der offene (OUTER) Character des Joins soll erhalten bleiben
    dann muss der Filter (WHERE) entsprechend großzügig und explizit formuliert werden.
    Dabei geht es um Exaktheit und im Falle des "Wertes" NULL sind dafür sogar eigene Operatoren fällig.

    Code:
    WHERE a.ma_key = 2 OR a.ma_key IS NULL

    Kommentar


    • #3
      Danke Perry, das hat mir zu einem Teil schon geholfen.

      es gibt einen weiteres Problem. Damit ich das jetzt nicht doppelt poste:

      http://www.datenbankforum.com/thread...22/#post-31151

      Kommentar


      • #4
        Zitat von engel4u Beitrag anzeigen
        Hallo,

        ich kapier es leider wieder mal nicht und brauche Eure Hilfe.

        Ich habe zwei Tabellen:

        Tabelle Produkte
        id produkt_key
        1 a
        2 b
        Tabelle Aktivitaeten
        id produkt_key ma_key
        1 a 1
        2 b 1
        3 a 3
        Ich möchte jetzt eine Liste aller Produkte haben, wobei die Produkte immer komplett ausgegeben werden sollen. In einer weiteren Spalte soll stehen, ob der entsprechende ma_key in der Tabelle aktivitaet enthalten ist oder nicht.

        Ich mache bisher:

        SELECT p.produkt_key, a.ma_key FROM Produkte p
        left JOIN aktivitaeten a on a.produkt_key = p.produkt_key
        where a.ma_key = 2

        Der ma_key 2 hat noch keine Aktivität, die Produktliste soll dennoch vollständig kommen. Sprich das Ergebnis sollte so aussehen:

        +-------------+--------+
        | produkt_key| ma_key |
        +-------------+--------+
        | a | null |
        | b | null |
        +-------------+--------+



        Beim ma_key 3 soll das Ergebnis so aussehen:

        +-------------+--------+
        | produkt_key| ma_key |
        +-------------+--------+
        | a | 3 |
        | b | null |
        +-------------+--------+



        Mit welchem Join bekomme ich das hin? Vielen Dank für Eure Hilfe...
        Ich gehe davon aus, daß der TE im anderen Forum weitermacht. Es hält dich, engel4u ja nichts davon ab, hier rein zu schauen.

        Demnach für andere, die ähnliche Probleme haben, das, was ich engel4u geschrieben hätte:
        1. Du hast deine beiden Tabellen gezeigt und deine Erwartung an das Ergebnis. Frage: wenn du für den Mitarbeiter ma_key = 2 ein Ergebnis erwartest, müsste doch irgendwo in einer der beteiligten Tabellen dieser MA (#2) auftauchen, oder? Tut er aber nicht, zumindest in den beiden gezeigten Tabellen! Also? Mag sein, daß du eine Tabelle mit den Mitarbeitern und allen vorhandenen ma_key hast, aber a. du erwähnst sie nicht und b. und vor allem: Sie ist an der gezeigten Abfrage nicht beteiligt. Das kann also schonmal so gar nicht funktionieren.
        2. Die Lösung von Perry Staltic kann nicht funktionieren und ist daher keine Lösung.
        3. Die Lösung führt über die Frage: Wie kann ich den Sachverhalt, daß es eine bestimmte ma/produkt-Kombination nicht gibt, darstellen? Es handelt bspw. um den Sachverhalt aus Zeile 2 der oben gezeigten, 2. Ergebnis-Tabelle:
          +-------------+--------+
          | produkt_key| ma_key |
          +-------------+--------+
          |...| ... |
          | b |null |
          +-------------+--------+
          Anschließend fragt sich: Was brauchen wir, um festzustellen, daß diese Kombination fehlt, müssten uns dazu nicht alle Kombinationen vorliegen?
        Am Schluß gebe ich bereits den Lösungshinweis. Die Lösung möchte ich noch nicht geben, die betr. Leute wollen ja was lernen.

        Kommentar


        • #5
          Zitat von Samuel7 Beitrag anzeigen

          Ich gehe davon aus, daß der TE im anderen Forum weitermacht. Es hält dich, engel4u ja nichts davon ab, hier rein zu schauen...
          Die Lösung, zunächst mal ohne Herleitung, die stand ja im Grunde schon in #4:
          Code:
          SELECT aa.ma_key, a.product_key
          FROM (
              SELECT ma_key, product_key
              FROM mitarbeiter, produkte) AS aa
              LEFT JOIN aktivitaeten AS a
                  ON a.ma_key = aa.ma_key
                  AND a.product_key = aa.product_key
              ORDER BY aa.ma_key, aa.product_key;
          bzw. mit dem WHERE-Clause:
          Code:
          SELECT aa.ma_key, a.product_key
          FROM (
              SELECT ma_key, product_key
              FROM mitarbeiter, produkte) AS aa
              LEFT JOIN aktivitaeten AS a
                  ON a.ma_key = aa.ma_key
                  AND a.product_key = aa.product_key
              WHERE aa.ma_key = 3;


          ;

          Kommentar

          Lädt...
          X