好像不关数据库的事, 这只是一种算法, 好像叫bom

解决方案 »

  1.   

    呵呵
    其实可以这样
    将两列表全部读出来分别放到两个链表里左边一栏为A链表
    右边一栏为B链表再用一循环
    从B链表中删除在A链表中存在的数据最后的B链表便是你要的结果
      

  2.   

    程序发给你了
    怕你没收到所以再贴一次
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, DB, ADODB;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        ADOQuery1: TADOQuery;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        chain1,chain2,chain3:tstringlist;
        procedure addnode(str1:string);
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.addnode(str1: string);
    var
      i:integer;
    begin
      for i:=0 to chain2.Count-1 do
      begin
        if chain1.Strings[i]=str1 then
        if not (chain3.IndexOf(chain2.Strings[i])<>-1) then
        begin
          chain3.AddObject(chain2.Strings[i],treeview1.Items.AddChild(chain3.objects[chain3.indexof(chain1.Strings[i])] as ttreenode,chain2.strings[i]));
          addnode(chain2.Strings[i]);
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      i:=0;
        adoquery1.Close;
        adoquery1.SQL.Clear;
        adoquery1.SQL.Add('select col1,col2 from search');
        adoquery1.Open;
        while not adoquery1.Eof do
        begin
          chain1.Add(adoquery1.fieldbyname('col1').AsString);
          chain2.Add(adoquery1.fieldbyname('col2').AsString);
          adoquery1.Next;
        end;    for i:=0 to chain2.Count-1 do
        begin
          if not ((chain2.IndexOf(chain1.Strings[i]))<>-1) then
          // if not chain3.indexof(chain1.strings[i])<>-1 then
             chain3.AddObject(chain1.Strings[i],treeview1.Items.AddChild(nil,chain1.Strings[i]));
        end;
        for i:=0 to chain3.Count-1 do
        begin
          //showmessage(chain3.strings[i]);      addnode(chain3.Strings[i]);
        end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
     chain1:=tstringlist.Create;
     chain2:=tstringlist.Create;
     chain3:=tstringlist.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      chain1.Free;
      chain2.Free;
      chain3.Free;
    end;end.