每个司机都有他在他们之间旅行的城市列表(表“mycities”)。
我想向他展示一份工作清单(来自JOBS表),其中开始城市和目标城市在他的列表中。我很困惑如何连接表来检查同时启动城市和目标城市:
如果我使用 OR 运算符,则结果不会涵盖两个城市,如果我使用 AND 运算符,结果将为空:
select * from jobs inner join mycities on
(mycities.city=jobs.startcity or mycities.city=jobs.targetcity)
答案 0 :(得分:1)
您将加入城市桌面两次,一次为目标城市开始一次。使用表别名来区分它们。
select *
from jobs
inner join mycities start on start.city = jobs.startcity
inner join mycities target on target.city = jobs.targetcity;
如果您不想从城市表中选择任何数据,则根本不会加入,而是使用IN
或EXISTS
代替:
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);