我的代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  sname:string;
begin
  query1.First;
  while not query1.Eof do
  begin
    sname:=query1.fieldbyname('name').AsString;
    query2.Close;
    query2.SQL.Clear;
    query2.SQL.Add
    ('update B set code = A.code where B.name='+#39+sname+#39);
    query2.ExecSQL;
    query2.Open;
    query1.Next;
  end;
end;
报如下错
Invalid field name code
A:
code    name
0001    aa
0002    bb
B:
name    hmh    code
aa      123      
aa      1234   
bb      321
cc      4321
我是想把A,B两表中,若name字段值相同,则更新B表的code为A表的code值.
我的问题出在何处?请高手指点!

解决方案 »

  1.   

    没这样做过,试一下行不
    'update B set code = A.code from A where B.name='+#39+sname+#39
      

  2.   

    update B set code = A.code where B.name='aa'
    从语法上分析不正确。建议使用存储过程,并使用游标来处理
      

  3.   

    这样就可以了'update B set B.code = A.code from A where B.name='+#39+sname+#39
      

  4.   

    或者:
    大概思路
    select code,name from a 
    open
    while not eof
    begin
    update B set code=:code where name=:name;

    next;
    end;
      

  5.   

    以下内容摘自T-SQL帮助文档:FROM 子句中指定的表的别名不能作为 SET column_name 子句中的限定符使用。例如,下面的内容无效:UPDATE titles
        SET t.ytd_sales = t.ytd_sales + s.qty
        FROM titles t, sales s
        WHERE t.title_id = s.title_id
        AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)若要使上例合法,请从列名中删除别名 t。即:UPDATE titles
        SET ytd_sales = t.ytd_sales + s.qty
        FROM titles t, sales s
        WHERE t.title_id = s.title_id
        AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)
      

  6.   

    UPDATE b
    SET code =
            (SELECT code
          FROM a
          WHERE a.name = b.name)
      

  7.   

    我用了楼上的方法
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      query2.Close;
      query2.SQL.Clear;
      query2.SQL.Add('UPDATE B SET code =(SELECT code FROM A WHERE A.name=B.name)');
      query2.ExecSQL;
      query2.Open;
    end;
    得到如下结果:
    A:
    code    name
    0001    aa
    0002    bb
    B:
    name    hmh    code
    aa      123    0001  
    aa      1234   0001
    bb      321    0002
    cc      4321   0002
    其中name为cc也更新了一次,请问怎么办?
      

  8.   

    我现在用DBF做实验,然后在PostgreSQL上操作
      

  9.   

    'UPDATE B
     SET code =(SELECT code FROM A WHERE A.name=B.name)'
    用这种方法应该没问题的,如果不行,那你就要做个循环了。
    v_code : string;
    query1.close;
    query1.sql.clear;
    Query1.sql.add(SELECT code FROM A );
    Query1.open;
    Query1.First;
    for i:=0 to Query1.RecordCount do
    begin
      v_code:='';
      v_code:=Query1.FieldByName('code').AsString;
      query2.Close;
      query2.SQL.Clear;
      query2.SQL.Add('UPDATE B SET code v_code');
      query2.ExecSQL;
      query2.Open;
      Query1.Next; 
    end;
    你试一试上面的方法,看看可不可以
    也许还要做修改;
      

  10.   


    'UPDATE B
     SET code =(SELECT code FROM A WHERE A.name=B.name)'
    是可以的,但是更新出的结果有错误
    cc      4321   0002
    此记录的name值并不存在于A表中,但是依然正常更新得到此错误的结果
    程序中只要遇到不匹配的记录,它就会照上一条记录的结果更新,直到找到匹配的记录才正常
    也就是(我把数据重新改过,得到这个结果)
    name    hmh    code
    aa      123    0001  
    aa      1234   0001
    cc      4321   0001
    bb      321    0002
      

  11.   

    with query2 do
    begin
      Close;
      SQL.Clear;  
      SQL.Add('update B set code = A.code from B,A where B.name=A.name');
      ExecSQL;
    end;
      

  12.   

    hiflower(花) 和weizi2000(秋风啊)的语句都可以,这么简单的问题搞那么复杂干嘛。