Hi!
- Ich möchte alle Einträge von Tabelle B haben, bei denen number und serial auch in Tabelle A existieren.
SELECT *
FROM TabelleB
INNER JOIN TabelleA
ON TablleA.serial=TabelleB.serial AND TabelleA.number=TabelleB.number
WHERE TabelleB.serial LIKE '%812%'
AND DATE( TabelleB.date ) = '2009-11-19'Der Query läuft auch und läuft und läuft und läuft. [...] Ist es "nur" ein Performanceproblem?
Vermutlich. Was sagt EXPLAIN? Vermutlich, dass keine Indexe - so vorhanden - für die WHERE-Klausel verwendet werden können.
TabelleB.serial LIKE '%812%'
ist ungünstig, weil es keinen "Mitten"-Index gibt. Es muss also jeder Datensatz einzeln durchgesehen werden.
DATE( TabelleB.date ) = '2009-11-19'
Die Formel um die Tabellenspalte sorgt im Allgemeinen auch dafür, dass sie einzeln für jeden Datensatz berechnet werden muss. Wenn in der Spalte, die "date" heißt, stattdessen ein DATETIME-Wert enthalten ist, dann sorgt ein
TabelleB.date BETWEEN '2009-11-19 00:00:00' AND '2009-11-19 23:59:59'
schon einmal dafür, dass überhaupt ein Index verwendet werden kann.
- Ich möchte alle Einträge von Tabelle B haben, bei denen number und serial in Tabelle A NICHT existieren.
Das bekommt man üblicherweise über einen OUTER JOIN (LEFT JOIN, RIGHT JOIN). Bei einem solchen werden alle Datensätze der einen Tabelle verwendet, auch wenn es keine passende Gegenstücke gibt. In diesem Fall ist NULL statt der Werte der Spalten der zweiten Tabelle im Ergebnis. Darauf kann man testen.
Lo!