类似这样的SQL语句
select * from (select * from t0 where t0.id not in(select id from t1 where ...)) t2left join ...
left join ...
(这里left join 5个表)full join (select * from t3 where t3.id not in(select id from t4 where ...)) t5目前的写法是这样的,但是每次执行的时候,都会提示“通信通道的文件结束”,
如果我把这些语句裁开执行,则都可以通过,或者我把最的一个 full join改为left join也可能执行成功,
我考虑原因是,SQL语句本身没有问题,只是因为关联太复杂,所以执行不成功,
不知各位高手,有什么好的解决办法?

解决方案 »

  1.   

    1。你最好一个full join 是要跟前面所有连接后的结果进行全连接还是和第五个lefte join的结果进行全连接?你必须指明!所以你要再加一层括号来指明到底和哪个结果集进行全连接2。另外,效率上来说用exists替代in
    如:select * from t3 where  not exists(select 1 from t4 where t3.id=id  ...)
      

  2.   

    gelyon,你太帅了,用exists替代了in,就没问题了还有一个问题,比如说,我现在有1W个编号,形式如“1,2,4,5,7...”,我用什么方法去查询,才能最快得找到和这些编号关联的数据呢 如:select * from a where id in(1,2,4,5,7...)
      

  3.   


    如果你的内层结果集“1,2,4,5,7...”已经是明确的这些值了,那么没什么好的方法了,只能用你的in(1,2,4,5,7...)
    如果内层结果集是通过其他表查询所得,且和外层表有关联栏位,那么用exists就好了,方法跟我上面一样。
      

  4.   

    还有一个就是加index试下,即外层表ID和内层表ID都加index
      

  5.   

    我有一个新想法,不知道可以不可以这样查select a.* from a
    right join (
    select 1 as id
    union select 2 as id
    union select 3 as id
    ) b on a.id=b.id因为如果用in的话,in(1,2,3,4...)括号内的元素最多只能1000个,而我需要的,可能是远远大于这个数
      

  6.   

    建立个配置表,把你所需的元素都配置进去,最后再从这个元素中取出!!!不过这也不是最完美的。
    可以通过存储过程遍历这个配置,然后取出自己需要的结果来再次,你还可以通过写存储过程来完成,建立临时表。把自己需要的数据都放临时表中,如果需要的数据多且繁琐的话,那就建立多个临时表。最后取出需要的数据后,再对所有的临时表进行turncate table...很多思路可以去完成。
      

  7.   


    如果编号比较少且确定,可以用上面的in。如果较多,几十个到上万个,肯定不能用in来拼了。可以建一个表把这些编号导进去,然后用exists关联查询。