类似这样的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语句本身没有问题,只是因为关联太复杂,所以执行不成功,
不知各位高手,有什么好的解决办法?
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语句本身没有问题,只是因为关联太复杂,所以执行不成功,
不知各位高手,有什么好的解决办法?
如:select * from t3 where not exists(select 1 from t4 where t3.id=id ...)
如果你的内层结果集“1,2,4,5,7...”已经是明确的这些值了,那么没什么好的方法了,只能用你的in(1,2,4,5,7...)
如果内层结果集是通过其他表查询所得,且和外层表有关联栏位,那么用exists就好了,方法跟我上面一样。
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个,而我需要的,可能是远远大于这个数
可以通过存储过程遍历这个配置,然后取出自己需要的结果来再次,你还可以通过写存储过程来完成,建立临时表。把自己需要的数据都放临时表中,如果需要的数据多且繁琐的话,那就建立多个临时表。最后取出需要的数据后,再对所有的临时表进行turncate table...很多思路可以去完成。
如果编号比较少且确定,可以用上面的in。如果较多,几十个到上万个,肯定不能用in来拼了。可以建一个表把这些编号导进去,然后用exists关联查询。