我有4个表:如果else语句的MySQL
- 镇
- 部
- 地区
- 国家
一个department
有一个外键region
和region
到Country
A town
有3个外键给其他表,但其中只有一个应该填充,其他必须为空。 这是因为您可以通过以下外键到达城镇的Country
及其departement
或region
。
现在我想做一个SQL查询,返回我所有的城镇与他们的部门,地区,国家(如果设置)。 而问题是,我不能根据哪个城镇的FK设置不同的连接。
如何获得这项工作?
我有4个表:如果else语句的MySQL
一个department
有一个外键region
和region
到Country
A town
有3个外键给其他表,但其中只有一个应该填充,其他必须为空。 这是因为您可以通过以下外键到达城镇的Country
及其departement
或region
。
现在我想做一个SQL查询,返回我所有的城镇与他们的部门,地区,国家(如果设置)。 而问题是,我不能根据哪个城镇的FK设置不同的连接。
如何获得这项工作?
如何:
SELECT …
FROM Town
LEFT JOIN Department ON Department.id = Town.department
LEFT JOIN Region ON Region.id = COALESCE(Town.region, Department.region)
LEFT JOIN Country ON Country.id = COALESCE(Town.country, Region.country)
COALESCE
需要从它的参数的第一个非NULL
值。所以在这种情况下,来自Town
的值会覆盖其他设置。正如你声明一个有区域参考的城镇不会有部门参考,只有其中一个应该不是NULL
,所以如果你的数据如你所说,顺序无关紧要。 LEFT JOIN
确保您为没有匹配的表获得NULL
值。如果您需要的国家/地区只有它的ID,则可以省略最后的加入,并将COALESCE
包含在您选择的值中。
这是查询以显示值。
select town.*,Department.*,Region.*,Country.* from town,Department,Region,Country where town.Dept_Id = Department.Dept and town.Region_Id = Region.Region_Id and town.Country_Id = Country.Countr_Id and Department.Region_Id = Region.Region_Id and Region.Country_Id = Country.Country_Id
取而代之,您可以使用左连接查询。此查询将花费更多的执行时间。左连接查询
select * from town left join Department ON Department.id = Town.department left join Region ON Region.id = coalesce (Town.region, Department.region) left join Country ON Country.id = coalesce (Town.country, Region.country)
您可以在表之间使用'LEFT JOIN';如果你不熟悉这个语法,Jeff Atwood在这里有一个很好的介绍:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – dash
你能在[SQL Fiddle](http://www.sqlfiddle.com/)上共享您的数据模型?这使得更容易理解你的问题。 – Kai
我试过使用'CASE',但它不能用于使不同的连接基于结果,它只返回一个值。数据模型比我的例子更复杂,事实上,我也必须提取部门,地区和国家的翻译。(我正在制作模型) – Leto