A表:
ID    name
------
1      ABC
2      CDE
3      FGHB 表:
F1    F2    F3
--------
1     2    张三 
3     1    李四
其中F1,F2的值是A表中ID字段的值,
现在需要用SELECT 语句取出B 表的值,并根据F1,F2的值取出A表中name字段对应的值,该如何写SQL语句呢?
我使用SELECT A.*,B.* FROM A INNER JOIN B ON (A.ID=B.F1)只能取出F1对应的name值,对于F2对应的name值不知道如何取出,请教大家!!
谢谢!!!

解决方案 »

  1.   

    那就再多关联一次嘛
    SELECT b1.name as F1_Name, b2.name as F2_Name, A.F3 FROM A 
    inner join B b1 on A.F1 = b1.ID
    inner join B b2 on A.F2 = b2.ID
      

  2.   

    试过了,好像不行
    yyfhz(火山),你试过吗?能不能把结果告诉我?谢谢
      

  3.   

    select C.* ,aa.name as F1name from (select b.*,A.name as F2name from B left join A on B.F2=A.ID) as c left join on A as aa on c.F1 = aa.ID
      

  4.   

    先JOIN 得到一个有F2 name结果再与A  JOIN 得到F1 name.
      

  5.   

    我希望得到的结果如下:
     ----------------
    |ABC | CDE | 张三|
    -----------------
    |FGH | ABC | 李四|
     ----------------谢谢snowredhxh(梦醒了),我先试试
      

  6.   

    snowredhxh(梦醒了),我按照你的方法,SQL语句如下,但错误:
    select C.*, A.name from(select B.*, A.name from B left join A on B.F2=A.id) as C left join on A as aa on C.F1=aa.id
    错误信息:
    fmSQLEditor.Query:
    Invalid token.
    Dynamic SQL Error.
    SQL error code = -104.
    Token unknown - line 1, char 24.
    select.
    难道这个地方不对?我用的interbase6.5
      

  7.   

    select C.*, A.name from(select B.*, A.name from B left join A on B.F2=A.id) as C left join  A as aa on C.F1=aa.id第二个JOIN后面多了个  on
      

  8.   

    改了后还是那个错误,难道不支持括号后的select?
      

  9.   

    select B.*, A.name from B left join A on B.F2=A.id 那括号中这个能正确吗
      

  10.   

    select a1.ID as a1ID,a2.ID as a2ID,b.F3 
    from a as a1,a as a2,b
    where b.F1=a1.ID and b.F2=a2.ID
      

  11.   

    搞错字段了 这样的
    select a1.name as a1name,a2.name as a2name,b.F3 
    from a as a1,a as a2,b
    where b.F1=a1.ID and b.F2=a2.ID
      

  12.   

    to snowredhxh(梦醒了) 
    select B.*, A.name from B left join A on B.F2=A.id 括号中这个是正确的,但放在括号中就不能通过了
      

  13.   

    sorry 表写反了
    应该是
    SELECT a1.name as F1_Name, a2.name as F2_Name, B.F3 
    FROM B 
    inner join A a1 on B.F1 = a1.ID
    inner join A a2 on B.F2 = a2.ID
      

  14.   

    to yyfhz(火山)
    按照你的写法,得到的结果是:
    ABC   ABC    李四
    CDE   CDE    张三好像前一个结果被第二个给覆盖了?
    希望的结果是
     ------------------------------
    |ABC | CDE | 张三|
    -------------------------------
    |FGH | ABC | 李四|
     ------------------------------
      

  15.   

    火山,不是吧,我就这么倒霉?我用的是interbase6.5,你呢?不会是数据库的问题吧?
    我的interbase好像有点问题,表名和字段名都要加"才能正确运行,例如你给我的语句:
    SELECT "A"."name" as F1_Name, "A"."name" as F2_Name, "B"."F3"
    FROM "B"
    inner join "A" "a1" on "B"."F1" = "a1"."id"
    inner join "A" "a2" on "B"."F2" = "a2"."id"要这样才不报错,不然就说找不到表或字段什么的错误,晕的很
    我的结果怎么会和你的不一样呢?
      

  16.   

    等我把它换成interbase7.5试试……
      

  17.   

    我知道了。
    你在查询的时候应该用别名吧?否则大家都是"A" 数据库是不好辨别是哪个"A"表的。
    试试下面的语句:
    SELECT "a1"."name" as F1_Name, "a2"."name" as F2_Name, "B"."F3"
    FROM "B"
    inner join "A" "a1" on "B"."F1" = "a1"."id"
    inner join "A" "a2" on "B"."F2" = "a2"."id"ps: 8好意思,没用过Interbase,刚装了6.5,可是登录不上去,报账号密码未注册的作用。Interbase的初始化账号密码难道不是SYSDBA吗?
      

  18.   

    试一下这句呢Select aa.ID, aa.FName, bb.FName, aa.F3 
    From 
      (Select A.ID, A.Fname, B.F3 From A Join B on B.F1 = A.ID) aa Join
      (Select A.ID, A.Fname, B.F2, B.F3 From A Join B on B.F2 = A.ID) bb on aa.F3 = bb.F3
      

  19.   

    创建数据表:testa
    SQL> create table testa(ID number, name varchar2(10));Table createdSQL> insert into testa values(1, 'ABC');1 row insertedSQL> insert into testa values(2, 'CDE');1 row insertedSQL> insert into testa values(3, 'FGH');1 row inserted
    --testb:
    SQL> create table testB(F1 number, F2 NUMBER, F3 varchar2(10));Table created
    SQL> insert into testb values(1, 2,  'zhangsang');1 row insertedSQL> insert into testb values(3, 1,  'lisi');1 row inserted
    数据表为:
    SQL> select * from testa;        ID NAME
    ---------- ----------
             1 ABC
             2 CDE
             3 FGH
    SQL> select * from testb;        F1         F2 F3
    ---------- ---------- ----------
             1          2 zhangsang
             3          1 lisisql语句如下:
    SQL> select a.*, (select name from testa where id = a.F1 and rownum = 1) name1,  (select name from testa where id = a.F2 and rownum = 1) name1
        from testb a;
    得到的结果:
            F1         F2 F3         NAME1      NAME1
    ---------- ---------- ---------- ---------- ----------
             1          2 zhangsang  ABC        CDE
             3          1 lisi       FGH        ABC
    ----------------
    不知道楼主想要的是不是这个结果(以上在oracle10g,pl/sql6.0上测试成功)
      

  20.   

    火山是对的,那天晚上回去终于搞好了,确实是别名的作用.查了IB自带的SQL参考,这种方法叫self join.
    给分!