2012-11-16 338 views
1

我有4个表:如果else语句的MySQL

  • 地区
  • 国家

一个department有一个外键regionregionCountry

A town有3个外键给其他表,但其中只有一个应该填充,其他必须为空。 这是因为您可以通过以下外键到达城镇的Country及其departementregion

现在我想做一个SQL查询,返回我所有的城镇与他们的部门,地区,国家(如果设置)。 而问题是,我不能根据哪个城镇的FK设置不同的连接。

如何获得这项工作?

+1

您可以在表之间使用'LEFT JOIN';如果你不熟悉这个语法,Jeff Atwood在这里有一个很好的介绍:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – dash

+0

你能在[SQL Fiddle](http://www.sqlfiddle.com/)上共享您的数据模型?这使得更容易理解你的问题。 – Kai

+0

我试过使用'CASE',但它不能用于使不同的连接基于结果,它只返回一个值。数据模型比我的例子更复杂,事实上,我也必须提取部门,地区和国家的翻译。(我正在制作模型) – Leto

回答

3

如何:

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包含在您选择的值中。

0

这是查询以显示值。

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)