Forum: PC-Programmierung [SQL] umgedrehte Abfrage über Linktables


von Vlad T. (vlad_tepesch)


Lesenswert?

Hi,
da der Titel etwas merkwürdig anmutet hier eine etwas ausführlichere 
Beschreibung:

Ich habe eine Link-Table, die mittels a_ref- und b_ref-Feldern eine 
n:n-Beziehung realisiert.
1
CREATE TABLE linktable ( a_ref INTEGER REFERENCES A(id)
2
                       , b_ref INTEGER REFERENCES B(id)
3
                       );

Jetzt möchte ich aber nicht anhand von einer a-id oder b-id die jeweils 
zugeordneten Elemente aus der anderen Tabelle finden, sonern umgedreht:

ich habe eine Liste I mit b-ids (l_I - Länge [2-5]) und möchte wissen, 
ob es eine a-id gibt, die mit genau all diesen (nicht mehr und nicht 
weniger) b-ids verlinkt ist.

Ich komm einfach auf keine praktikable Lösung, habt ihr eine Idee?

Was mir eingefallen ist, wäre ein l_I-facher Join mit sich selbst auf 
die a_ref und komplizierter Veroderung der Tests von b_ref gegen die 
Listenelemente.

für den Fall l_I=2:
1
SELECT t1.a_ref 
2
FROM      linktable AS t1 
3
     JOIN linktable AS t2 
4
       ON (t1.a_ref = t2.a_ref)
5
WHERE   (t1.b_ref = I[0] AND t2.b_ref=I[1])
6
     OR (t1.b_ref = I[1] AND t2.b_ref=I[0]);

Das ist allerdings keine Praktikable Lösung, da bereis bei 3 Elementen, 
die Joins riesig werden und die Whereklausel auch exponentiell wächst.
Außerdem ist damit auch noch nicht das Problem gelöst, dass ich nur 
einen Treffer haben will, wenn es nur genau die beiden Einträge gibt.

Hat jemand eine bessere Idee?

Gruß
Vlad

von Sebastian L. (Gast)


Lesenswert?

wenn du sicher stellen kannst dass die Kombination a_ref und b_ref 
unique ist kannst du mit einer abfrage von b_ref zählen wie viele 
Elemente du hast
solange du nur eine ja nein aussage brauchst.

wenn du wissen willst welches fehlt müsstet du in einer schleife prüfen 
ob es die Kombination a_ref b_ref gibt. also a_ref inkrementieren und in 
einer liste speichern ob die combi existiert

letzteres funktioniert auch wenn die Kombination nicht unique ist dann 
kriegst du halt mehrerer rows zurück sonst nur eine

von Sebastian L. (Gast)


Lesenswert?

ups

du wolltest ja von a_ref ausgehend suchen,
a_ref und b_ref tauschen :)

von Peter II (Gast)


Lesenswert?


von Vlad T. (vlad_tepesch)


Lesenswert?

Sebastian L. schrieb:
> wenn du sicher stellen kannst dass die Kombination a_ref und b_ref
> unique ist

ist es nicht. Es kann gut sein, dass der gleiche b_ref mehrmals mit dem 
gleichen a_ref verlinkt ist. Das ist auch wichtig.

Sebastian L. schrieb:
> wenn du wissen willst welches fehlt müsstet du in einer schleife prüfen

Die alternative Schleifen ist mir natürlich auch bewusst.
Ich würde dann alle unterschiedlichen a_refs holen, in dessen b_refs 
eins (zb das erste) der Listenelemente auftaucht und dann die so 
gefundenen a-ids durchackern.


Peter II schrieb:
> http://msdn.microsoft.com/en-us/library/ms186243.aspx
Danke, das kannte ich bisher nicht (konnte es jetzt auf den ersten BLick 
aber auch nicht komplett verstehen).
SQLite scheint es aber sowieso nicht zu unterstützen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.