我用access数据库查询数据,由于数据类型太多,将近10万种,每选中一种sql语句就要增加,比如:'and 种类='''+名称,结果造成sql语句太长,超出了access数据库的极限,一运行就提示“查询过于复杂”。这个问题该怎么解决呢?

解决方案 »

  1.   

    将sql语句分成多句,用+连接,或者多次AddsQL.Clear;
    SQL.Add('select * ');
    SQL.Add('from users);
      

  2.   

    写成多行,不能解决长度问题。
    DELPHI中生成SQL语句,好像最长只有100多行,多了就会查询过于复杂。
      

  3.   

    这里有个类似的问题:SQL语句过长引发的常规网络错误(最高分奉送)
    http://community.csdn.net/Expert/topic/4615/4615553.xml?temp=.7266657
      

  4.   

    分开查,关键是怎么分啊,access一次and不能超过99,而我这里要加上万个
      

  5.   

    access好像最多只能设几百个字段,你一次查询要用上万个AND,不知你要查询什么样的条件,感觉就是有10万个不同种类,也不应该这样写查询语句,给一大段查询语句让大伙看看,到底是什么样的查询,或许有更简单的查询方法。
      

  6.   

    我的程序中有一个treeview显示的树形结构,上面的节点有10层,大约10万个,当用户选中有一个,某一些或全部,要查询出相应的数据。我用循环判断哪些节点被选中,同时给sql语句增加and条件,这样就出现太多的and造成access无法处理,我该怎么办呢?
      

  7.   

    也许你需要优化一下你的程序,否则即使Access能支持添加上万个and条件,电脑和数据库也会被拖死机.
      

  8.   

    不清楚你对数据的分类,treeview十层结构,应该对应10个分类字段,有10万个点,LEVEL是0是,查询是最简单的,LEVEL到9是,AND会用9个,LEVEL 0 级之间用 or 语句来连接,用户查询一个LEVEL0 下 的节点,如果不复选,查询语句最多9个AND,不清楚你的0级有多少个,1到9级,每级之间有多少个,如果客户复选查询,客户要选择多少个节点才会生成上万的AND呢?
    如果按客户复选的都是最后一级(第9级),客户需要复选1000次以上,才会生成上万个AND,客户会这样复选吗?点击鼠标1000次,这要多长时间啊?
    如果显示全部,一句就可以了。
    如果0到9级之间内容没有重复,客户选择那级,直接查询此级对应的字段内容就可以,复选项之间用 OR 就可以了, AND 用不上了。
      

  9.   

    因为提供了全选的功能,所以用户只需点一下,就可以把所有节点选中,我的判断语句是选一个加一个and。
      

  10.   

    全选和没有条件显示全部数据不一样吗?
    应该都是
    selec * from Table
    没必要再判断什么了?
      

  11.   

    统一楼上的。另外,如果能在类型编号上做点文章,用Like查询会减少不少的工作量--除非哪个家伙真的会死板的选择几百次。
      

  12.   

    如果能在编号上做一点文章,例如类型
    Type_ID  Description
    01       工业产品
    0101     汽车
    010101   载重汽车
    010102   客车
    0102     飞机
    010201   直升机
    010201   航天飞机
    ...
    如果选择了所有的工业产品,那么就like "01%",如果选择的是所有的汽车,那么就like "0101%"。
    也就是说,由于这样的编号可以直接构造出结构数,因此在全选的情况下可以减少代码量。
    另外,如果某个家伙先全选,再移去自己不要的类型(我装软件的时侯就经常这么干),那么就需要比较一下是写一堆的like语句好呢还是写一个like语句再加上几个not语句好啦。
      

  13.   

    不要用 and,用In 试试
      

  14.   

    1)关键是看你要做什么了。。你可以 一个一个的找 。然后在拼起来。
    2)一般人选择不会超过15个的
    3)全部用and 条件估计出来的条数 为  0 条
    4)构架有问题
      

  15.   

    我现在就是在查询前对整个tree循环,找到一个被选中的节点就用一个and,最后拼起来,造成sql语句中and太多,access报错。我的程序中除了可以单一选中和取消功能外,提供了一次选中本级及下级所有节点的功能,这样用户可以轻易选中大量节点,这样使用like代替and无法实现
      

  16.   

    说来说去,都是你的程序设计有问题,无论什么样的需求,你也不能搞出个上万and的查询啊。。目录树的查询操作,有你这么设计的么?
      

  17.   

    如果有10层10万个节点,那么,客户也不可能点上万次来选择节点,所以,上万个and的情况肯定不好出现,客户选择的只是其中为数不多,可能几十个,你可以对节点先排序显示,然后给节点加上序号,查询的时候直接用序号范围来判断,怎么会象你这么设计的呢?
      

  18.   

    to happyct:
    我前面说了关于节点的选择问题,用户可以点几下鼠标就选中大量的节点。另外您说先排序显示再加序号,查询时判断的说法我无法理解,现举个例子,请您解惑
    Type_ID  Description
    001       工业产品
    001001         飞行器
    001001001           飞机
    001001001001           军用飞机
    001001001001001            战斗机
    001001001001001001             a系列
    001001001001001001001             xxx编号

    001001001001001001900             xxxx编号

    001001001001001999             z系列

    001001001001020            运输机

    001001001003          民用飞机

    001001005           飞碟
                  
    这样可以一个树形结构,用户可以选中任意节点和该节点的子节点,也可以取消本级节电的选中或取消本级节点和其所有子节点的选中,现在我想查询所有飞行器中军用飞机除了运输机和战斗机a系列xxx编号所有的数据,sql语句该怎么写?
      

  19.   

    多次用sql.add()就好了,我以前也碰到一样的问题,可以解决的
      

  20.   

    to mzxrh320:   我说的问题不是delphi里sql语句过长,而是access的限制(and不能超过99个,sql语句字符不超过64000个)。