如果做连续的左连接,比如a left join B on a.XX = b.XX left join c on b.xx = c.xx,这样一个左连接,是不是先做AB的左连接,然后结果出来后,这个结果再和C做左连接。注意上面的语句中我后面这个左连接的条件是用b.xx = c.xx,而非A.XX=C.XX,这里的B是经过A,B左连接过滤以后的。具体再举个说明,比如说要从A表中取学生ID,B表中取学生姓名,AB表通过学生ID关联,C表中取任课老师姓名,BC表通过课程ID关联。A表是成绩表,B表是学生表,C表是课程信息表,最终语句是这样:select a.studentid, b.studentname, c.teachername from A a left join B b on a.studentid = b.studentid left join C c on b.teacherid = c.teacherid where a.score > 80,这样我就能查出成绩大于80的学生的ID,名字,任课老师姓名。不知我这样理解是不是正确。再问个问题,左连接最后出来的记录数,不管有多少个连续左连接,记录数肯定等于第一个表中查出来的记录数,不知道这个理解有没有问题

解决方案 »

  1.   

    select
    a.order_id,
    a.ordertype,
    a.applyorg,
    b.item_id,
    b.price,
    b.amount,
    (case when b.templateid=1 then 1
          when b.templateid=2 then 1
          when b.templateid=3 then b.send_num
          when b.templateid=4 then b.send_num end) as send_num,
    b.templateid,
    c.detailid,
    c.goodid as detail_goodsid,
    c.goodcode,
    c.goodname,
    c.mobilenum,
    c.bn,
    (case
       when b.templateid=1 then '号码'
       when b.templateid=2 then '卡片'
       when b.templateid=3 then '物资'
       when b.templateid=4 then '手机终端' end) as goodstype,
    (case
       when b.templateid=1 then 5
       when b.templateid=2 then 1
       when b.templateid=3 then 2
       when b.templateid=4 then 4 end) as cat_id
    from scm_order a
    left join scm_order_item b on a.order_id=b.order_id
    left join scm_order_item_detail c on b.item_id=c.itemid
    where a.isaudit=1
    上面是个例子。
    left join 就是记录数等于左表的记录数了。
      

  2.   

    oracle可以这样写:
    select a.studentid, b.studentname, c.teachername from A a , B b ,C c where a.score > 80 and a.studentid  = b.studentid (+) and b.teacherid = c.teacherid (+) 
      

  3.   

    你第一个问题:理解正确
    你第二个问题:理解有点出入,比如你例子中的 where a.score > 80 就会起到过滤的作用,那么查处的记录数肯定和第一个表的数据量就不同了。
                  但是如果没有过滤条件的话你的理解是正确的。
      

  4.   

    select a.studentid, b.studentname, c.teachername 
    from A a left join B b on a.studentid = b.studentid and a.score > 80
    left join C c on b.teacherid = c.teacherid 
    你试试这样写对吗?这样是不是既保证了数据量,又起到了过滤作用
      

  5.   

    这是一对一和一对多的区别
    不止在left join会出现结果记录增加
    在inner join也会出现