如何在(字符串)条件下为WHERE使用SQL表而不是长字符串

时间:2018-09-22 17:07:34

标签: sql sql-server

我有以下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)

不幸的是,这似乎不起作用,即查询不返回任何条目。

  1. 这是应对长期状况的正确方法吗?
  2. 我应该改为使用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
    

3 个答案:

答案 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的区别

我会将产品列表表生成为带有索引列的临时表,这样查询将以更快的连接速度运行