Marcel: Verflixtes Query

Guten Abend!

Ich beiss mir die Zähne an einem verflixten Query aus. Es sind drei Tabellen:

Tabelle 1:
---------------------
id_t1 ¦ name        ¦
---------------------
1     ¦ Produkt A   ¦
2     ¦ Product B   ¦
---------------------

Tabelle 2:
---------------------
id_t2 ¦ name        ¦
---------------------
1     ¦ Zubehör C   ¦
2     ¦ Zübehör D   ¦
---------------------

Tabelle 3 (Ordnet Zubehör dem Produkt zu):
-----------------------------
¦ id_t1       ¦ id_t2       ¦
-----------------------------
¦ 1           ¦ 1           ¦
¦ 2           ¦ 1           ¦
-----------------------------

Jetzt möchte ich für ein Produkt alle Zubehör-Artikel mit Namen erhalten, welche diesem Produkt noch NICHT zugeordnet sind.

Für Produkt A wäre die Lösung also D.
Für Produkt B wäre die Lösung also D.

Für euch ist das wahrscheinlich einfach, aber ich blick nicht ganz durch. Klar ist mir, dass ich ein INNER JOIN zwischen Tabelle 2 und Tabelle 3 habe. Aber wie verknüpf ich Tabelle 1?

Gruss Marcel

  1. ...ach ja, das ganze sollte auch noch in MSSQL funktionieren...

  2. Halihallo Marcel

    Jetzt möchte ich für ein Produkt alle Zubehör-Artikel mit Namen erhalten, welche diesem Produkt noch NICHT zugeordnet sind.

    SELECT Name
      FROM Zubehoer
      WHERE ZubehoerId NOT IN (
        SELECT ZubehoerId
           FROM ProduktZubehoerBinder
           WHERE ProduktId=<DeineWahl>
      )

    Sollte auf allen RDBMS mit Subqueries (MySQL erst seit 4.1.x)
    funktionieren, incl. MSSQL.

    Du denkst IMHO zu weit. Subqueries können das Leben erheblich
    vereinfachen. Die Frage ist nur, ob Dein "anderes" DBMS (welches
    du nicht nennst) Subqueries auch unterstützt.

    Falls nicht, gibt es Lösungen über LEFT [OUTER] JOIN's und z.B. dem
    MySQL-Operanden ISNULL(...).

    Viele Grüsse

    Philipp

    1. Hallo Philipp

      Vielen Dank! Das hat mir echt geholfen!:

      SELECT Name
        FROM Zubehoer
        WHERE ZubehoerId NOT IN (
          SELECT ZubehoerId
             FROM ProduktZubehoerBinder
             WHERE ProduktId=<DeineWahl>
        )

      Sollte auf allen RDBMS mit Subqueries (MySQL erst seit 4.1.x)
      funktionieren, incl. MSSQL.

      Ich habe mich ein bisschen unglücklich ausgedrückt. Ich wollte sagen, dass das Query auf MSSQL und nur auf MSSQL funktionieren muss;-)

      Gruss Marcel

  3. yo,

    .... Klar ist mir, dass ich ein INNER JOIN zwischen Tabelle 2 und Tabelle 3 habe.

    ist das den so klar, dass das ein inner join ist und nicht eventuell ein outer join ? es geht ja um die zubehör teile, die eben noch keine verknüpfung mit einem bestimmten artikel haben und das hört sich mehr nach einem outer join an, der nach NULL werte abfragt.

    versuch mal zwei left joints ausgehend von der zubehör tabelle (tabelle2).

    Ilja

    1. Hallo

      yo,

      .... Klar ist mir, dass ich ein INNER JOIN zwischen Tabelle 2 und Tabelle 3 habe.

      ist das den so klar, dass das ein inner join ist und nicht eventuell ein outer join ? es geht ja um die zubehör teile, die eben noch keine verknüpfung mit einem bestimmten artikel haben und das hört sich mehr nach einem outer join an, der nach NULL werte abfragt.

      versuch mal zwei left joints ausgehend von der zubehör tabelle (tabelle2).

      Jo ich hatte schon sehr vieles versucht. Naja, das mir der NULL-Abfrage wäre eine Idee gewesen, aber Philipp hat mir da eine einfachere Lösung gezeigt...

      Danke & Gruss

      Marcel

      1. yo,

        Jo ich hatte schon sehr vieles versucht. Naja, das mir der NULL-Abfrage wäre eine Idee gewesen, aber Philipp hat mir da eine einfachere Lösung gezeigt...

        viele wege führen nach rom und die lösung von phillipp ist sehr gut. unterabfragen machen das leben für den menschen wirklich erheblich leichter, für das dbms allerdings oftmals schwerer, da es zu performance problemen bei grossen datenmenegen führen kann nicht muss. deswegen lohnt es sich manchmal mehrere wege auszuprobieren und die für dich beste zu nehmen.

        Ilja