1.
Bus表
-------
reg_no|
tno   |
cno   |
-------Cleaner表
---------
cno     |
cname   |
---------
下面这个是合并自身表格的代码,表示列出Betty(可能是个组长)负责的每辆车所对应的清洁工(cleaner)的名字:select c2.cname
from bus b1, bus b2, cleaner c1, cleaner c2
where c1.cname='Betty'
and b1.cno=c1.cno --对于合并自身表格,能不能解释一下这几行的意思,不大懂
and b1.tno=b2.tno --对于合并自身表格,能不能解释一下这几行的意思,不大懂
and b2.cno=c2.cno --对于合并自身表格,能不能解释一下这几行的意思,不大懂2.这个是4个表的合并,分别是bustype,bus,cleaner和depot四个表,我写了下面的代码,但是报错了,不知道出什么问题,请高手帮忙看看,谢谢!!
Select cl.cno,cl.cname,de.dname,b.reg_no
From cleaner cl,depot de,bus b 
Where bustype.cno=cl.cno
And bustype.dno=de.dno 
And bustype.reg_no=b.reg_no

解决方案 »

  1.   

    1:
    select c2.cname
    from bus b1, bus b2, cleaner c1, cleaner c2
    where c1.cname='Betty'
    and b1.cno=c1.cno --对于合并自身表格,能不能解释一下这几行的意思,不大懂
    and b1.tno=b2.tno --对于合并自身表格,能不能解释一下这几行的意思,不大懂
    and b2.cno=c2.cno --对于合并自身表格,能不能解释一下这几行的意思,不大懂
    -----------
    b1是第一个bus表的别名
    b2是第二个bus表的别名
    c1是第一个cleaner表的别名
    c2是第一个cleaner表的别名b1.cno=c1.cno 就是第一个bus表的cno等于第一个cleaner表的cno
    b1.tno=b2.tno 就是第一个bus表的tno等于第二个bus表的tno
    b2.con=c2.cno 就是第二个bus表的cno等于第二个cleaner表的cno2:
    Select cl.cno,cl.cname,de.dname,b.reg_no
    From cleaner cl,depot de,bus b 
    Where bustype.cno=cl.cno
    And bustype.dno=de.dno 
    And bustype.reg_no=b.reg_no
    --------
    From 中没有bustype表, 在where中为何有bustype表名呢
      

  2.   


    Select cl.cno,cl.cname,de.dname,b.reg_no
    From cleaner cl,depot de,bus b 
    Where bustype.cno=cl.cno
    And bustype.dno=de.dno 
    And bustype.reg_no=b.reg_nobustype从哪儿来的啊?
      

  3.   


    Select cl.cno,cl.cname,de.dname,b.reg_no
    From cleaner cl,depot de,bus b,bustype bt
    Where bt.cno=cl.cno
    And bt.dno=de.dno 
    And bt.reg_no=b.reg_no这样应该就没问题了吧。
      

  4.   

    你先执行 selct * from Bus,Cleaner
    你会得到一个笛卡尔积.后面的
    and b1.cno=c1.cno
    and b2.cno=c2.cno 
    就是在这个笛卡尔积里面筛选出符合and b1.cno=c1.cno
    and b2.cno=c2.cno 这个条件的
    比如create table a(a1 int ,a2 varchar(20))
    insert a 
    select 1,'a'
    union 
    select 2,'b'create table c(a1 int ,a2 varchar(20))
    insert c 
    select 1,'a'
    union 
    select 2,'b'
    select * from a ,c 得到 
    1(a.a1) a(a.a2) 1(b.a1) a(b.a2)
    2 b 1 a
    1 a 2 b
    2 b 2 b再看select * from a,c where a.a1=b.a1
    在上面的结果中选择出a.a1=b.a1的记录就有
    第1行和第四行所以