我有4张桌子:
department
有region
的外键和region
到Country
town
对其他表有3个外键,但只应填充其中一个,其他表必须为空。
这是因为你可以通过跟随外键到达城镇Country
及其departement
或region
。
现在我想创建一个SQL查询,它将所有城镇,区域,国家(如果已设置)返回给我。 而问题在于我不能根据哪个城镇的FK设置来制作不同的连接。
如何完成这项工作?
答案 0 :(得分: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
包含在您选择的值中。
答案 1 :(得分: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)