多表的 inner join與left join;
阿新 • • 發佈:2018-12-09
當前情況
目前有三個表,關係如下:
1. sc表,有 student_id, class_id
2. student表,有student_id,student_name,
3. class表,有class_id,class_name,class_address_id,
4. address表,有address_id,address_name
相同名字的欄位相對應。
假設分別有如下資料:
insert into sc values(1,2);
insert into student values(1,'張三');
insert into class values(2 ,'高數',3);
insert into address values(3,'一號樓');
如果要查詢出相關的資訊,本身SQL應該如下:
select s.student_name,c.class_name,a.address_name
from SC sc
inner join student s on s.student_id=sc.student_id
inner join class c on sc.class_id=c.class_id
inner join adderss a on a.address_id =c.address_id
查詢出的資訊如下:
張三,高數,一號樓 。
業務要求
假設現在業務情況如下: 課程會刪除,地址也會刪除,但要求仍然顯示有sc的記錄。操作如下:
delete from class;
delete from address;
insert into class values(3,'高數',5);
insert into address values(5,'二號樓');
若使用原來的sql,則無法查詢到sc的記錄。現在將sql改變從如下:
select s.student_name,c.class_name,a.address_name
from SC sc
inner join student s on s.student_id=sc.student_id
/* 原來都是inner,現在將class表的 改成了left*/
left join class c on sc.class_id=c.class_id
inner join adderss a on a.address_id =c.address_id
但是仍然無法查詢出資料。因為: sc的資料是(1,2); sc的2是class_id,關聯class表中class_id為2的資料;但是class表中現在無id為2的資料,但因為與class的關聯使用了left,其實不影響。如果sql為:
select s.student_name,c.class_name
from SC sc
inner join student s on s.student_id=sc.student_id
/* 原來都是inner,現在將class表的 改成了left*/
left join class c on sc.class_id=c.class_id
其實仍然能查詢出資料,為:張三、(null)
但因為class與address的關聯仍然為inner join,所以無法顯示。將sql改為如下:
select s.student_name,c.class_name,a.address_name
from SC sc
inner join student s on s.student_id=sc.student_id
/* 原來都是inner,現在將class表和address表的inner 改成了left*/
left join class c on sc.class_id=c.class_id
left join adderss a on c.address_id=a.address_id
則能查詢資料,為:張三、(null)、(null)
總結
一表為主表,一表為子表。有時雖然字表的資料已經更改了,但要求仍然顯示主表的資料。此時使用left join即可。但若 子表還關聯了子子表,則子表與子子表的關聯也需要使用left join,不然仍然不顯示主表的該條資料。