Frage zu 'WHERE ... IN (...)'

Servus!

Ich bin kurz vorm verzweifeln…
Folgendes Szenario:
Ich habe 2 Tabellen AA und BB mit jeweils >20.000 Datensätzen. AA hat die Spalte aa, BB hat die beiden Spalten ba und bb.
Die Werte von aa können sowohl in ba, als auch in bb auftauchen.
Ich möchte jetzt gerne alle Zeilen von AA anzeigen, bei denen aa entweder in ba oder in bb vorkommt.
Ich habe es mit folgendem SQL-Befehl versucht:

SELECT A.aa, B.ba, B.bb FROM AA A, BB B
WHERE A.aa IN (SELECT ba FROM BB)
OR A.aa IN (SELECT bb from BB);

Wenn ich das ganze mit LIMIT 0,10 aufrufe hat A.aa immer den gleichen Wert, obwohl er nicht mit B.ba oder B.bb übereinstimmt. Ohne das Limit steigt nur die CPU-Auslastung auf 99% und ich kann vermutlich Jahre warten, ohne dass sich was tut…

Was mache ich da falsch?

Ach ja - das ganze passiert unter MySQL…

Hallo.

Ich möchte jetzt gerne alle Zeilen von AA
anzeigen, bei denen aa entweder in
ba oder in bb vorkommt.

aa darf also in irgendeiner Spalte und irgendeiner Zeile von BB vorkommen? Oder bist du auch an den passenden BB-Zeilen interessiert?

Ich habe es mit folgendem SQL-Befehl versucht:

SELECT A.aa, B.ba, B.bb FROM AA A, BB B
WHERE A.aa IN (SELECT ba FROM BB)
OR A.aa IN (SELECT bb from BB);

Das sind alle Paare von AA- und BB-Zeilen, bei denen aa irgendwo in der ganzen BB-Tabelle vorkommt. B.ba und B.bb in deiner Select-Liste haben also gar keinen Bezug zu dem aktuellen A.aa (die drei BBs in den FROM-Klauseln haben nichts miteinander zu tun) und deswegen werden alle möglichen Kombinationen ausgegeben (also bei einem passenden A.aa dieses etwa 20000-mal kombiniert mit allen Bs). Wenn die Mehrheit deiner A.aa’s irgendwo in B vorkommt, hat das Ergebnis so ca. 400 Millionen Zeilen (fast das gesamte kartesische Produkt aus AA und BB!).

Ich könnte mir vorstellen, dass du eher das hier wolltest:

SELECT A.aa, B.ba, B.bb FROM AA A, BB B
WHERE A.aa = B.ba
OR A.aa = B.bb

oder falls es dir tatsächlich nicht auf die BB-Zeilen ankommt, eine dieser (gleichbedeutenden) Varianten:

SELECT A.aa FROM AA A
WHERE A.aa IN (SELECT B.ba from BB)
OR A.aa IN (SELECT B.bb from BB)





SELECT A.aa FROM AA A
WHERE exists (SELECT \* FROM BB where A.aa = B.ba or A.aa = B.bb)

Falls diese Anfragen immer noch zu langsam sind, dürften Indexe auf B.ba und B.bb Wunder wirken (falls noch nicht vorhanden).

Gruß,
Andreas

DANKE!!!
Irgendwie habe ich es verpeilt :wink:
Aber die Indexe (oder heisst es Indizes?) hatte ich schon gesetzt!

Hi!

Gibt’s ev. ein UNION unter mySQL

SELECT A.aa FROM AA A
WHERE a.aa in (SELECT aa FROM BB union select ba from bb)

Grüße,
Tomh