求一SQL语句!!!

yplin 2006-02-28 12:44:09
A表:
ID name
------
1 ABC
2 CDE
3 FGH

B 表:
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值不知道如何取出,请教大家!!
谢谢!!!
...全文
293 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yplin 2006-03-03
  • 打赏
  • 举报
回复
火山是对的,那天晚上回去终于搞好了,确实是别名的作用.查了IB自带的SQL参考,这种方法叫self join.
给分!
ChrisMao 2006-03-01
  • 打赏
  • 举报
回复
试一下这句呢

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
yyfhz 2006-03-01
  • 打赏
  • 举报
回复
我知道了。
你在查询的时候应该用别名吧?否则大家都是"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吗?
citywanderer2005 2006-03-01
  • 打赏
  • 举报
回复
创建数据表:testa
SQL> create table testa(ID number, name varchar2(10));

Table created

SQL> insert into testa values(1, 'ABC');

1 row inserted

SQL> insert into testa values(2, 'CDE');

1 row inserted

SQL> 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 inserted

SQL> 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 lisi

sql语句如下:
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上测试成功)
yplin 2006-02-28
  • 打赏
  • 举报
回复
等我把它换成interbase7.5试试……
yyfhz 2006-02-28
  • 打赏
  • 举报
回复
我用的是oracle...
yplin 2006-02-28
  • 打赏
  • 举报
回复
把这个帖子加到100分,郁闷了……
yplin 2006-02-28
  • 打赏
  • 举报
回复
火山,不是吧,我就这么倒霉?我用的是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"

要这样才不报错,不然就说找不到表或字段什么的错误,晕的很
我的结果怎么会和你的不一样呢?
yyfhz 2006-02-28
  • 打赏
  • 举报
回复
我测试过啊,是正常的。
yplin 2006-02-28
  • 打赏
  • 举报
回复
to yyfhz(火山)
按照你的写法,得到的结果是:
ABC ABC 李四
CDE CDE 张三

好像前一个结果被第二个给覆盖了?
希望的结果是
------------------------------
|ABC | CDE | 张三|
-------------------------------
|FGH | ABC | 李四|
------------------------------
yyfhz 2006-02-28
  • 打赏
  • 举报
回复
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
yplin 2006-02-28
  • 打赏
  • 举报
回复
to snowredhxh(梦醒了)
select B.*, A.name from B left join A on B.F2=A.id 括号中这个是正确的,但放在括号中就不能通过了
terence4444 2006-02-28
  • 打赏
  • 举报
回复
搞错字段了 这样的
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
terence4444 2006-02-28
  • 打赏
  • 举报
回复
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
snowredhxh 2006-02-28
  • 打赏
  • 举报
回复
select B.*, A.name from B left join A on B.F2=A.id 那括号中这个能正确吗
yplin 2006-02-28
  • 打赏
  • 举报
回复
改了后还是那个错误,难道不支持括号后的select?
snowredhxh 2006-02-28
  • 打赏
  • 举报
回复
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
yplin 2006-02-28
  • 打赏
  • 举报
回复
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
yplin 2006-02-28
  • 打赏
  • 举报
回复
我希望得到的结果如下:
----------------
|ABC | CDE | 张三|
-----------------
|FGH | ABC | 李四|
----------------

谢谢snowredhxh(梦醒了),我先试试
snowredhxh 2006-02-28
  • 打赏
  • 举报
回复
先JOIN 得到一个有F2 name结果再与A JOIN 得到F1 name.
加载更多回复(3)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧