सोचा था कि जब मैं इससे 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)
;