2017-05-24 3 views
0

Table1 ist virtuelle Tabelle mit fts4 und TABLE2 ist normal table.SQLite Android Join Operation auf FTS4

Query1 (WORKS)

SELECT * FROM TABLE1 LEFT OUTER JOIN TABLE2 ON TABLE1.id=TABLE2.id WHERE TABLE1 MATCH 'sometext' LIMIT %d,%d 

Abfrage 2 (FUNKTIONIERT NICHT)

SELECT * FROM TABLE2 LEFT OUTER JOIN TABLE1 ON TABLE1.id=TABLE2.id WHERE TABLE1 MATCH 'sometext' LIMIT %d,%d 

Fehler von Query2

android.database.sqlite. SQLiteEx nehmung: unable Funktion MATCH in dem gewünschten Kontext (Code 1)

Daraus scheint es, wie FTS Tabl verwenden muß zuerst sein auf LEFT OUTER JOIN. Warum das passiert? Join passiert zuerst, bevor die WHERE-Klausel angewendet wird. Wenn es also nicht für einen Fehlertyp der Tabelle funktioniert, ging ich davon aus, dass es auch mit Abfrage1 nicht funktionieren würde. Bitte erklären Sie das bitte. Was passiert intern? Auch jeder Link zur Referenzseite würde es begrüßen, wenn Sie dies erklären würden.

+0

Warum sind Sie TABLE2 auf TABLE2 beitreten wollen? MATCH dient auch zum Vergleichen einer Spalte, die nicht mit einer Tabelle übereinstimmt. – BladeCoder

+0

Es war ein Tippfehler. Ich habe es bearbeitet. Es tut uns leid. Auch als sqlite doc Tabelle kann für die linke Seite angegeben werden. In diesem Fall wird versucht, aus allen Spalten zu suchen. – varuog

Antwort

1

MATCH funktioniert nur in der FTS-Tabelle selbst, daher muss es vor dem Join ausgeführt werden. In der zweiten Abfrage sucht die Datenbank zuerst die übereinstimmenden Zeilen (bei einem äußeren Join hat sie keine Auswahlmöglichkeit in der Join-Reihenfolge) und dieses temporäre Ergebnis ist keine FTS-Tabelle mehr.

Wenn FTS verwendet, ist es in der Regel eine bessere Idee, um die FTS-Suche (oder die andere Suche) in eine Unterabfrage zu bewegen:

SELECT * 
FROM Table2 LEFT JOIN (SELECT * 
         FROM Table1 
         WHERE Table1 MATCH ...) 
      USING (id); 
+0

Also ist es richtig, dass in Abfrage1 erste FTS-Tabelle mit Übereinstimmungen zuerst ausgewertet und dann mit Tabelle2 Join passiert? – varuog

+0

Ja, das ist die Reihenfolge, in der der Abfrageoptimierer verwendet wird. –

+0

ist es nur mit sqlite? soweit ich mich mit mysql erinnern kann funktioniert es anders als das. – varuog