Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql查询以选择“开始城市”和“目标城市”在“我的城市”列表中的作业_Sql_Inner Join - Fatal编程技术网

Sql查询以选择“开始城市”和“目标城市”在“我的城市”列表中的作业

Sql查询以选择“开始城市”和“目标城市”在“我的城市”列表中的作业,sql,inner-join,Sql,Inner Join,每个司机都有一份他在两个城市之间旅行的城市列表 (mycities.city=jobs.startcity and mycities.city=jobs.targetcity) 我想给他看一张工作表中的工作列表,起始城市和目标城市在他的列表中。我不知道如何连接表以同时检查起始城市和目标城市: 如果我使用OR运算符,结果不会覆盖两个城市,如果我使用and运算符,结果将为空: select * from jobs inner join mycities on (mycities.city=job

每个司机都有一份他在两个城市之间旅行的城市列表

(mycities.city=jobs.startcity and mycities.city=jobs.targetcity)
我想给他看一张工作表中的工作列表,起始城市和目标城市在他的列表中。我不知道如何连接表以同时检查起始城市和目标城市:

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

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

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

select * 
from jobs 
inner join mycities start on start.city = jobs.startcity
inner join mycities target on target.city = jobs.targetcity;
如果您不想从city表中选择任何数据,则根本不会加入,而是使用in或EXISTS:


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

select * 
from jobs 
inner join mycities start on start.city = jobs.startcity
inner join mycities target on target.city = jobs.targetcity;
如果您不想从city表中选择任何数据,则根本不会加入,而是使用in或EXISTS:

这意味着startcity或targetcity在表mycities中

(mycities.city=jobs.startcity and mycities.city=jobs.targetcity)
这意味着startcity和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);
这意味着startcity或targetcity在表mycities中

(mycities.city=jobs.startcity and mycities.city=jobs.targetcity)
这意味着startcity和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);

非常感谢。你知道在大量数据中哪一个更快吗?不知道。无论如何,只要没有性能问题,我总是使用直接查询。因此,如果您不需要城市表中的任何数据,那么不要加入,只需在中查找。一些优化器较弱的数据库在EXISTS上工作得更好:where EXISTS从mycities中选择*,其中mycities.city=jobs.startcity。因此,在速度太慢或您更喜欢的情况下使用。只有当您仍然存在性能问题时,才使用连接。谢谢。你知道在大量数据中哪一个更快吗?不知道。无论如何,只要没有性能问题,我总是使用直接查询。因此,如果您不需要城市表中的任何数据,那么不要加入,只需在中查找。一些优化器较弱的数据库在EXISTS上工作得更好:where EXISTS从mycities中选择*,其中mycities.city=jobs.startcity。因此,在速度太慢或您更喜欢的情况下使用。只有当您仍然存在性能问题时,才使用连接。