2015-09-07 52 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 –