2015-09-07 53 views
0

索引掃描試圖解決這個問題:Sql: choose all baskets containing a set of particular items的PostgreSQL:交叉在相同的索引

換句話說有一個表:

tbl_basket_item 
--  
basketId itemId 

1 2 
1 3 
1 4 
2 3 
2 4 
3 2 
3 4 

的itemId被索引。

如果我在的itemId = 2執行掃描,我會得到:

SELECT basketId FROM tbl_basket_item WHERE itemId = 2 

1 
3 

如果我在的itemId = 4進行掃描,我會得到:

SELECT basketId FROM tbl_basket_item WHERE itemId = 4 

1 
2 
3 

我現在可以相交的兩次掃描來獲得:

SELECT basketId FROM tbl_basket WHERE 
    basketId IN (SELECT basketId FROM tbl_basket_item WHERE itemId = 2) AND 
    basketId IN (SELECT basketId FROM tbl_basket_item WHERE itemId = 4) 

1 
3 

使用一些PostgeSQL高級索引技術,如位圖索引

+1

究竟什麼是你的問題?你在找「interesct」操作符嗎?我也看不出具體的索引_type_與您的問題有什麼關係。這個陳述有沒有性能問題?如果是,那麼請閱讀:https://wiki.postgresql.org/wiki/Slow_Query_Questions –

+0

double NOT EXISTS()查詢生成結點表上內部查詢的索引掃描(即使對於這個非常小的rowcount = 7) – joop

+0

@joop我會試試看! –

回答

1

你有效地得到一個「交叉索引掃描」(不管這有效是)做一個標準INTERSECTSELECT

SELECT basketId FROM tbl_basket_item WHERE itemId = 2 
INTERSECT 
SELECT basketId FROM tbl_basket_item WHERE itemId = 4; 
+0

這就是我一直在尋找的!性能如何? (在官方頁面上沒有發現任何關於此的註釋)。 –

+0

工程就像一個魅力:http://sqlfiddle.com/#!15/1885a/7 –