Verflixtes Query
Marcel
- datenbank
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
...ach ja, das ganze sollte auch noch in MSSQL funktionieren...
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
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
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
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
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