用于选择开始和目标城市位于我的城市列表

时间:2017-05-13 08:58:31

标签: sql inner-join

每个司机都有他在他们之间旅行的城市列表(表“mycities”)。

我想向他展示一份工作清单(来自JOBS表),其中开始城市和目标城市在他的列表中。我很困惑如何连接表来检查同时启动城市和目标城市:

如果我使用 OR 运算符,则结果不会涵盖两个城市,如果我使用 AND 运算符,结果将为空:

select * from jobs inner join mycities on 
(mycities.city=jobs.startcity or mycities.city=jobs.targetcity)

2 个答案:

答案 0 :(得分:1)

您将加入城市桌面两次,一次为目标城市开始一次。使用表别名来区分它们。

select * 
from jobs 
inner join mycities start on start.city = jobs.startcity
inner join mycities target on target.city = jobs.targetcity;

如果您不想从城市表中选择任何数据,则根本不会加入,而是使用INEXISTS代替:

select * 
from jobs 
where startcity in (select city from mycities)
and targetcity in (select city from mycities);

答案 1 :(得分:1)

(mycities.city=jobs.startcity or mycities.city=jobs.targetcity)

这意味着startcity OR targetcity位于“mycities”表中。

(mycities.city=jobs.startcity and mycities.city=jobs.targetcity)

这意味着startcity AND targetcity位于表格“mycities”中,但

a=b and a=c mean also b=c

...所以你只能获得这个工作,其中startcity = targetcity,这就是结果为空的原因。

你可能想要使用类似的东西:

SELECT * FROM jobs WHERE 
   startcity IN (SELECT * FROM mycities) AND
   targetcity IN (SELECT * FROM mycities);