我现在有一个表查询, 要用两个字段来都符合条件 来查询结果 
SELECT * 
FROM orders 
WHERE quantity =1 AND customer = 'Tizag' 现在遇到的问题是 
现在我们有一组的的数据 要查询 最简单的做法是Java里写一个循环是 
for(int i=0;i<listA.size();i++){ 
SELECT * 
FROM orders 
WHERE (quantity =listA.get(0)  AND customer = listB.get(0)) 
} 然后一条一条连接数据库查, 这样速度非常慢 
或者写成一条语句 
SELECT * 
FROM orders 
WHERE (quantity =listA.get(0)  AND customer = listB.get(0)) 
OR (quantity =listA.get(1)  AND customer = listA.get(1)) or 
OR (quantity =listA.get(2)  AND customer = listA.get(2)) 这个LIST 可能有100K 条记录 这样就造成了SQL 非常的长。 
而一条一条查要100K次 大家有什么其他好的建议没有。谢谢。 

解决方案 »

  1.   

    用java拼接出一个变量字符串 sqlWhere =   '值1','值2','值3'  ,然后用 in sqlWhere 这样的sql
      

  2.   

    用union all 试试 or的效率太低
      

  3.   


    select *
      from (select o.order_id,
                   p.product_name,
                   Row_Number() OVER(partition by order_id ORDER BY product_name desc) rank
            
              from orders o
              left join order_product p on o.order_id = p.order_id)
     where rank = 1
      

  4.   

    建立一个临时表 TempTbl(quantity,customer) 把 listA.get(0),listA.get(1) 之类的值插入临时表,然后用下面语句查询。
    select * from  orders a,TempTbl b where a.quantity=b.quantity and a.customer=b.customer
     
      

  5.   

    像这种问题,要想提高速度,就是用最少次的sql去做,尽管sql再长,速度也会比你这样循环多次查询快。如果是我的话,我会选择拼接长sql语句(如果可以的话),或者用4楼的做法,但是这个临时表选择用sqlite3的内存模式去做。
      

  6.   

    需要直接在SQL里执行么?还是用程序调用?
    程序调用的话在程序里拼串然后无论是in数据组还是条件判断用or都比较容易写如果直接执行的话,就先定义个一个参数来把串拼出来
    ,可以写个存储过程或者函数,定义一个临时的varchar串来存放你拼好的数据,然后调用下
      

  7.   

    100K的数据如果单单insert到数据库可能都要10分钟时间..不要说查询了...
    最好就是用临时表了..把LIST的数据插到临时表里,然后用存储过程处理...处理结果也放到临时表里..然后JAVA去读临时表....