[SQL] umgedrehte Abfrage über Linktables

OP #2618466
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
Gast
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
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.