2017-05-24 39 views
0

Table1是虛擬表,其中fts4TABLE2normal table。從QUERY2SQLite Android在FTS4上的加入操作

android.database.sqlite

查詢1(工程)

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

查詢2(不工作)

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

錯誤。 SQLiteEx ception:無法使用功能MATCH 在請求的上下文(代碼1)

從這個好像FTS TABL必須先在LEFT OUTER JOIN。爲什麼會這樣呢?在應用WHERE子句之前首先發生連接。所以如果它不適用於表類型不匹配,我假設它不會與查詢1一起工作。任何人都請解釋一下。內部發生了什麼?此外任何鏈接參考網站將不勝感激解釋這一點。

+0

爲什麼你想加入TABLE2上TABLE2?此外,MATCH用於匹配列,不匹配表。 – BladeCoder

+0

這是一個錯字。我編輯它。抱歉。也可以按照每個sqlite doc表格指定左側。在這種情況下,它會嘗試匹配所有列。 – varuog

回答

1

MATCH只適用於FTS表本身,所以它必須在連接之前執行。 在第二個查詢中,數據庫首先查找匹配行(使用外連接,它在連接順序中沒有選擇),並且該臨時結果不再是FTS表。

當使用FTS,它通常是一個更好的主意了FTS搜索(或其他搜索)移動到一個子查詢:

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

因此,在query1中首先評估匹配的FTS表是正確的,然後與table2一起發生連接? – varuog

+0

是的,這是查詢優化器恰好使用的順序。 –

+0

它只與sqlite?至於我可以記住與MySQL的工作不同於此。 – varuog