如果做连续的左连接,比如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,名字,任课老师姓名。不知我这样理解是不是正确。再问个问题,左连接最后出来的记录数,不管有多少个连续左连接,记录数肯定等于第一个表中查出来的记录数,不知道这个理解有没有问题
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 就是记录数等于左表的记录数了。
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 (+)
你第二个问题:理解有点出入,比如你例子中的 where a.score > 80 就会起到过滤的作用,那么查处的记录数肯定和第一个表的数据量就不同了。
但是如果没有过滤条件的话你的理解是正确的。
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
你试试这样写对吗?这样是不是既保证了数据量,又起到了过滤作用
不止在left join会出现结果记录增加
在inner join也会出现