现有一名单表a,包含纳税人编码,表不大,可能只有几条记录。数据表b,有纳税人各年分税种税款信息,有的有效,有的无效。表很大,记录在一亿条以上。另外名单表a中的纳税人,可能在表b中没有记录(有登记信息,没有税款缴纳记录)。那么,怎么取表A中的纳税人的税款信息?select a.nsbm, sum(税额)
from a, 
(select b.nsbm, 税额 from b
where yxbz='Y' and 属期 ) c
where a.nsbm=c.nsbm(+)
group by a.nsbm肯定是可以的,但是感觉这么做速度很慢。远不如下面这个。select a.nsbm, sum(税额)
from a, b
where a.nsbm=b.nsbm
and  b.yxbz='Y' and b.属期但是下面这个又会丢失在b中没有记录的单位。请问一下该怎么办? 

解决方案 »

  1.   

    select a.nsbm, sum(税额)
    from a left join b
    on a.nsbm=b.nsbm
    where b.yxbz='Y' and b.属期
      

  2.   

    不好意思。我跟这条语句弄混了,所以不敢用LEFT JOINselect a.nsbm, sum(税额)
    from a , b
    on a.nsbm=b.nsbm(+)
    where b.yxbz='Y' and b.属期 这样做的话会丢记录的。看来LEFT JOIN 是比(+)好呀。
      

  3.   

    (+),和LEFT outer功能是一样的,只是你(+)的位置,你要放对地方!
      

  4.   

    如果这个很快的话可以用多加一层的方式select a.nsbm,c.税额  from a,(select a.nsbm, sum(税额) 税额
    from a, b
    where a.nsbm=b.nsbm
    and b.yxbz='Y' and b.属期...) c
    where a.nsbm=c.nsbm(+)
      

  5.   

    用左外连接即可,即左边这个表的所有行均显示出来。
    LEFT JOIN和 (+)功能是一样的,做左外连接时+放到等号的右边。
    + 放在哪个表的后面,就会将另一表中所有记录显示出来。