1

我有 4 张桌子:

  • 部门
  • 地区
  • 国家

Adepartment有一个外键 toregion和一个regiontoCountry

Atown对其他表有 3 个外键,但只应填写其中一个,其他表必须为空。Country这是因为您可以使用其departementregion通过外键到达该镇。

现在我想做一个 SQL 查询,返回所有城镇及其部门、地区、国家(如果已设置)。问题是我无法根据设置的城镇 FK 进行不同的加入。

如何得到这份工作?

4

2 回答 2

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)

COALESCENULL从其参数中获取第一个非值。所以在这种情况下,来自的值Town会覆盖其他设置。正如您所说,具有区域参考的城镇不会有部门参考,其中只有一个应该是 non- NULL,因此如果您的数据如您所说,顺序并不重要。LEFT JOINs 确保您获得不匹配的表的NULL值。如果您需要的只是该国家/地区的 id,则您可以省略最后一个连接并将 包含COALESCE到您选择的值中。

于 2012-11-16T12:32:34.543 回答
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)
于 2012-11-16T12:46:13.030 回答