CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

关于组合查询的求助?

楼主ahu()2000-01-21 22:31:00 在 Delphi / VCL组件开发及应用 提问

现有一个表,表中对应字段callno,class,depart合别建了三个副索引callindex,  
  classindex,departindex,并将字段id定义为key。  
  设计一窗中,在此窗口中用户可选择输入callno,employ,depart中一部分或全部。  
  如只输入callno的值67890查询,也可输入callno的值67890及class的值101进行组合  
  查询等等。不知怎样实现?是不是要为每种可能的组合建相应的索引,如果字段很多,  
  那索引不就太多了?我想不该这样,可就是束手无策,请高手指点迷津,并能给个例子。  
  万分感谢   !  
   
  ahu  
  2000.1.21   问题点数:100、回复次数:7Top

1 楼dxg()回复于 2000-01-21 23:02:00 得分 0

不必建相应的索引吧?!Top

2 楼kxy(手举穿肠毒药,怀抱刮骨钢刀)回复于 2000-01-22 01:02:00 得分 0

建立索引是为了提高查询等的速度,每一种情况都建索引没有必要,  
  把查询最多的情况建索引,如果有的查询太慢,而且很频繁,不妨给它  
  建一个索引.Top

3 楼yjq(渤海海峡)回复于 2000-01-22 01:31:00 得分 0

您的索引足够多了,您是用pardox表吧,pardox支持local   sql。用sql做组合查询,  
  实现容易,速度也不慢,delphi   自己就带local   sql   的帮助。xbase系列编程的思路  
  应尽早放弃。多用Tquery.  
  with   query   do  
  begin  
      close;  
      sql.clear;  
      sql.add('select   *   from   table   where   callno=:p1   and   employ=:p2   and   ..');  
      parambyname('p1').asinteger:=值;  
      parambyname('p2').asstring:=值;  
      ...  
      open;  
  end;  
  具体用法请看delphi的帮助。Top

4 楼agui(阿贵: 高级图形用户界面)回复于 2000-01-22 04:56:00 得分 40

如果你要排序,那就建索引;否则不用,可用SQL实现查询:  
  var  
      sSQL:   string;  
      sWhere:   strng;  
  begin  
      sSQL   :=   'select   *   from   table1';  
      if   Length(edtCallNo.Text)>0   then  
          sWhere   :=   'callno='+edtCallNo.Text  
      else  
          sWhere   :=   '';  
   
      if   Length(edtClass.Text)>0   then  
      begin  
          if   Length(sWhere)>0   then  
              AppendStr(   sWhere,   '   and   '   );  
          AppendStr(   sWhere,   'class='+edtClass.Text   );  
      end;  
   
      if   Length(edtDepart.Text)>0   then  
      begin  
          if   Length(sWhere)>0   then  
              AppendStr(   sWhere,   '   and   '   );  
          AppendStr(   sWhere,   'depart='+edtDepart.Text   );  
      end;  
   
      if   Length(sWhere)>0   then  
          AppendStr(   sSQL,   '   where   '+sWhere   );  
   
      Query1.SQL.Text   :=   sSQL;  
      Query1.Open;  
   
  这里把三个字段的值都假设为整数且你的程序都检查了用户的输入。  
   
  btw:   你好象键误了,employee《--》class  
  Top

5 楼boby_v(泪如雨下)回复于 2000-01-22 14:54:00 得分 10

不必建太多索引,只对查询最频繁的字段建索引。组合查询可以可以利用SQL语句的动态拼接来实现,而且可以体现SQL语言的灵活特点,从多个表中判断组合条件,查询可以写成  
  "select   *   from   table   where   column1   in    
              (select   column1   from   table1   where   ...)  
              and   column2   in  
              (select   column2   from   table2   where   ...)  
              ......"  
  把以上语句放入query中,在where   子句中传递查询条件,若没有选择此条件,就把这个where子句设为''。你可以先动态生成这个sql字符串,用MessageBox看一下,再执行查询!  
  Top

6 楼fstao()回复于 2000-01-22 16:19:00 得分 50

太简单了,例子如下:(不需要建副索引)  
  假如有三个字段callno,class,depart,分别对应Edit1、Edit2和Edit3。  
  在button1的onclick事件为:  
  var  
    sqlstring:string;  
  begin  
  if   edit1.text<>''   then  
    begin  
      sqlstring:='   callno='''+edit1.text+'''';  
    end;  
  if   edit2.text<>''   then  
    begin  
        if   sqlstring<>''   then  
            begin  
                  sqlstring:='and   class='''+eidt2.text+'''';  
            end  
        else  
            begin  
                  sqlstring:='class='''+eidt2.text+'''';  
            end;    
  if   edit3.text<>''   then  
    begin  
        if   sqlstring<>''   then  
            begin  
                  sqlstring:='and   depart='''+eidt3.text+'''';  
            end  
        else  
            begin  
                  sqlstring:='depart='''+eidt3.text+'''';  
            end;    
      end;      
    with   query1   do  
      begin  
        close;  
        sql.clear;  
        sql.add('select   *   from   table1   where');  
        sql.add(sqlstring);  
        open;  
      end;  
   
  end;  
  Top

7 楼DOU()回复于 2000-01-22 20:53:00 得分 0

正如各位所说,不需建太多索引  
  更简单的方法是:  
  利用SQL的   LIKE   句法。假定条件中的表字段皆为字符串或整型数值。  
  可创建一函数,参数为各输入框的值,返回构造的查询串。各参数为   par1,par2...parN  
  在函数中判定,若某参数为空字符串,则将其值赋为'%',否则不变化  
  参照ljq   的例子,但需要把   =   换成   LIKE   ,给查询串赋值时赋有可能变成'%'的参数值  
  当某字段为浮点数时,需转换成字符串类型。  
  不好意思,我不懂delphi,   只好如此写;)  
   
   
  Top

相关问题

  • 组合查询?
  • 组合查询问题
  • 组合查询的问题
  • 组合查询的问题
  • 如何组合查询
  • 综合查询(组合查询)的问题!
  • 真心求助!关于组合查询。
  • 如何实现条件组合查询
  • 关于组合查询结果(急!!!)
  • 组合查询中的DDDW问题

关键词

  • 查询
  • 字段
  • delphi
  • callno
  • swhere
  • 索引
  • sqlstring
  • appendstr
  • eidt
  • 字符串

得分解答快速导航

  • 帖主:ahu
  • agui
  • boby_v
  • fstao

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo