主表和从表已经建立了连接关系,怎么在从表里实现查询---满足连接关系的---。
就是说在从表里在按某个字段的不同的记录值进行查询。

解决方案 »

  1.   

    select distinct * from mastertable where masterkey in (select detail_masterkey from detailtable where ...........)
      

  2.   

    select * from 从表 where id in (select id from 主表 where ....)
      

  3.   

    问题是当主表的记录指针移动时如何取得变化的id给parameters,应该在什么事件里。
    select * from 从表 where id in(select id from 主表 where key=:parameters)
      

  4.   

    这是自动的啊!!主从表建立关联后不就行了吗?
    或者你用LOOKUP字段吧
      

  5.   

    看看下面:
      datasource1.dataset:=adoquery1;
      adoquery1.open;
      adoquery2.datasource:=datasource1;
      adoquery2.sql.clear;
      adoquery2.sql.add('select * from tableslave where key=:key');   //这里的key就是关键字段
      adoquery2.prepare;   //如果用adodataset,这个不能少
      adoquery2.open;
      

  6.   

    忘记提醒你了,上面是key=:key,而不是key:=key,看清楚呀。
    还有一个办法就是在datasource1的onchange时间或者adoquery1的afterscroll 事件中使用locate()方法跳转,其实我觉得后者比前者要好,如果你做大型的数据库就会发现,倘若使用了lookup字段,直接用master/slave模式会出现很多问题,我估计是delphi中 ado的一个bug。所以现在我轻易不用前面的方法了,而是用locate和SQL语句配合filter属性来实现。
    如果你用按我说的办法运行的时候提示参数不正确,请在adoquery2的params属性中把key的类型设置为string,value设置为unassign或者olestr就可以了。
      

  7.   

    to ndujun关于locate()跳转能不能再具体点。
      

  8.   

    我本来的想法是在主表显示的dbgrid的afterscroll事件里通过某个函数取得当前鼠标所指行的关联字段的当前值,然后以该值作为参数(=:key),实现查询。但是用locate就不怎么清楚。
      

  9.   

    adoquery1.Locate('字段名','我要查找你',[loCaseInsensitive]);
      

  10.   

    DBGrid没有afterscroll事件吧!可以这样。
    var
      FilterFieldName:string;
    ...
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
      FilterFieldName:=column.FieldName;
    end;
    procedure TADOQuery1.Afterscroll(Sender:TObject);
    begin
      if ADOQuery2.active then
         adoquery1.Locate(FilterFieldName,'我要查找你',[loCaseInsensitive]);
    end;如果你要实现筛选,那么就是
    procedure TADOQuery1.Afterscroll(Sender:TObject);
    begin
      if ADOQuery2.active then
         begin
            adoquery2.filtered:=false;
            adoquery2.filter:='关键字段 =+''''+filterfieldname+'''';
         end;
         
    end;
      

  11.   

    晕,我上面写错了,见笑见笑!
    把所有filterfieldname的地方改成adoquery1.fieldbyname(filterfieldname).value;
    对不起啊,哈哈