我有 4 张桌子:
- 镇
- 部门
- 地区
- 国家
Adepartment
有一个外键 toregion
和一个region
toCountry
Atown
对其他表有 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
会覆盖其他设置。正如您所说,具有区域参考的城镇不会有部门参考,其中只有一个应该是 non- NULL
,因此如果您的数据如您所说,顺序并不重要。LEFT JOIN
s 确保您获得不匹配的表的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)