คิดว่าฉันจะชิปในที่นี่ด้วยเมื่อฉันได้พบว่าจะมีประโยชน์มากกว่าON
USING
เมื่อการOUTER
รวมถูกนำไปใช้กับคิวรี
ON
ประโยชน์ที่ได้รับจากการอนุญาตให้ชุดผลลัพธ์ของตารางที่แบบสอบถามกำลังOUTER
เข้าร่วมถูก จำกัด ในขณะที่ยังคงOUTER
เข้าร่วม ความพยายามในการ จำกัด ผลลัพธ์ที่ตั้งไว้ผ่านการระบุWHERE
ข้อจะเปลี่ยนการOUTER
เข้าร่วมเป็นการINNER
เข้าร่วมได้อย่างมีประสิทธิภาพ
ได้รับนี้อาจเป็นกรณีมุมญาติ คุ้มค่าที่จะออกไปที่นั่นแม้ว่า .....
ตัวอย่างเช่น:
CREATE TABLE country (
countryId int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
country varchar(50) not null,
UNIQUE KEY countryUIdx1 (country)
) ENGINE=InnoDB;
insert into country(country) values ("France");
insert into country(country) values ("China");
insert into country(country) values ("USA");
insert into country(country) values ("Italy");
insert into country(country) values ("UK");
insert into country(country) values ("Monaco");
CREATE TABLE city (
cityId int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
countryId int(10) unsigned not null,
city varchar(50) not null,
hasAirport boolean not null default true,
UNIQUE KEY cityUIdx1 (countryId,city),
CONSTRAINT city_country_fk1 FOREIGN KEY (countryId) REFERENCES country (countryId)
) ENGINE=InnoDB;
insert into city (countryId,city,hasAirport) values (1,"Paris",true);
insert into city (countryId,city,hasAirport) values (2,"Bejing",true);
insert into city (countryId,city,hasAirport) values (3,"New York",true);
insert into city (countryId,city,hasAirport) values (4,"Napoli",true);
insert into city (countryId,city,hasAirport) values (5,"Manchester",true);
insert into city (countryId,city,hasAirport) values (5,"Birmingham",false);
insert into city (countryId,city,hasAirport) values (3,"Cincinatti",false);
insert into city (countryId,city,hasAirport) values (6,"Monaco",false);
-- Gah. Left outer join is now effectively an inner join
-- because of the where predicate
select *
from country left join city using (countryId)
where hasAirport
;
-- Hooray! I can see Monaco again thanks to
-- moving my predicate into the ON
select *
from country co left join city ci on (co.countryId=ci.countryId and ci.hasAirport)
;