2016-08-25 55 views
0

我正在尋找功能,以「短路方式」在一種條件(非字段)上連接兩個表,提供了連接操作絕對昂貴(a.field :: VARCHAR包含在廣泛的b.field :: TEXT中)。短條交叉/內部連接功能SQL條件,而不是字段(PostgreSQL)

我不需要重複,它更像是一個「場得到words.'word行‘這是包含在任何books.'content場’」的。如果第一本書包含它,則跳過檢查其他2000頁的書籍是否也包含它。

如果我沒看錯的,既不是INNER JOIN也不INTERSECT都在我的情況非常有用:

  • 對於相交,我不能對具體情況像CONTAINS相交,所以我需要找回在這兩個地方都登記,請執行笛卡爾積,然後根據何處進行篩選
  • 對於INNER JOIN,由於它返回重複項,因此我推斷邏輯不是短路,它會檢查我的詞是否包含在每本書的條目中
  • IN和EXISTS似乎也不適用於定製條件

有沒有什麼辦法以最佳性能表現我的需求?

+1

我真的不明白的問題(你可以添加一些示例數據?),但它看起來像你想有一個'選擇...從WHERE EXISTS(... FROM B,其中some_conditions_involving_a_and_b)' – joop

+0

我沒有想到這種方法,是的,它可以像SELECT詞從單詞WHERE EXISTS(SELECT 1 FROM books WHERE content LIKE CONCAT('%'',word,'%')。它是每個子查詢的高性能時間? – Whimusical

+0

子查詢是**不是**「每次都執行」。而EXISTS()適用於**每個**條件,即使是病態的情況,如'select * FROM a JOIN b ON exists(select 42 where random() <0.5);' – joop

回答

0
EXPLAIN ANALYZE 
SELECT * FROM words w 
WHERE EXISTS (SELECT 1 FROM books b 
     WHERE POSITION(w.word IN b.book) > 0 
     );