首次接触SQL嵌套语句

  终于要用到SQL嵌套语句了,虽然不用嵌套语句也可以有其他解决方案,但既然碰到了就研究一下。遇到的问题是这样,有两个表A,B,要求把A和B里面的每一条记录都读出来,而B表的每条记录都通过外键AId与A表里的记录建立唯一对应关系,但是B表里面的数据只是一个附加信息,所以B表的记录要比A表少的多~我只要在B表里提取两个字段M和N的信息~但由于B表的记录数并不和A表的记录数相等,所以不能用简单的select A.*,B.M,B.N from A,B where A.AId=B.AId来查询了。因为这样的话,如果B表是空的话,就会查询出0条记录~这是不符合需求的.....

  在这种情况下,我想到了SQL语句的嵌套,就尝试用一下了。其实SQL语句的嵌套就像是程序语言里的循环嵌套,这样子想就尝试写出了第一条嵌套SQL语句:select *,(select M from B where B.AId=A.AId) as  M from A;这样的结构就是每次在A表得出一条记录后,再用AId作为条件在B表查询一次,把得出的结果M作为字段M返给父查询。这样的嵌套只适合子查询只返回一个值的情况,也就像是上面所说的A表与B表的那种唯一对应关系。不过这条语句的子查询只返回一个字段M,这还不能满足需要的,但在这种情况下子查询也只能返回一个字

段...

    我用select *,(select concat(M,N) as mn from B where B.AId=A.AId) as MN from A;这样子字段MN得出是空值的,想不通~没办法了,只好这样子:select *,(select M from B where B.AId=A.AId) as M,(select N from B where B.AId=A.AId) as N from A;这样就没问题了~可以满足需要了~

  不过这条语句虽然不是三层嵌套,但每次在A表中查询出一条记录就要在B表中查询两次,这样的语句感觉还是不够优化,但现在也想不到应该怎么去优化这条语句~要继续研究了~

posted @ 2009-01-12 01:05  Fakis  阅读(1408)  评论(0编辑  收藏  举报