我有以下SQL语句:
select customer_id, prod_id, prod_start, prod_price
from prod_table
where prod_id in (PRODLIST)
不幸的是,PRODLIST
包含大约68K 6位数字。当我尝试在服务器上运行此查询时,收到一个错误,表明SQL无法处理字符串中显示的prod_id
。
我的下一个想法是将所有68K 6位数字放入列标题为included_prodlist
的单个列表included_prod_id
中。这样生成的included_prodlist
表将是一个具有68K行的单列表,并且每一列将是一个唯一的6位数字。
然后我可以使用inner join
对原始查询进行included_prodlist
,如下所示:
select customer_id, prod_id, prod_start, prod_price
from prod_table
where prod_id in (select included_prod_id from included_prodlist)
不幸的是,这似乎不起作用,即查询不返回任何条目。
我应该改为使用inner join
吗?
select customer_id, prod_id, prod_start, prod_price
from prod_table
inner join included_prodlist on prod_table.prod_id = included_prodlist.included_prod_id
答案 0 :(得分:1)
强烈建议将值放入表中。一栏应该是主键。
然后,我会选择exists
而不是not in
:
select p.customer_id, p.prod_id, p.prod_start, p.prod_price
from prod_table p
where exists (select 1
from included_prodlist ip
where ip.included_prod_id = p.prod_id
);
答案 1 :(得分:1)
当然,使用INNER JOIN
可以带来更好的性能。为了获得最佳实践,请创建查询执行计划中推荐的索引:)
答案 2 :(得分:0)
在嵌套查询中,最好在单列表上使用INNER JOIN
在嵌套查询中,内部查询运行第1次,其结果放置在外部查询中
使用连接,只有一个查询,最好在索引列上
您将能够看到在SELECT命令之前添加EXPLAIN的区别
我会将产品列表表生成为带有索引列的临时表,这样查询将以更快的连接速度运行